tag:blogger.com,1999:blog-69269852451781975422024-03-18T08:16:51.079-07:00C ProgressivoCurso de linguagem C, completo, online, gratuito, com apostila para downloadUnknownnoreply@blogger.comBlogger116125tag:blogger.com,1999:blog-6926985245178197542.post-66710544353908720262020-09-27T11:46:00.001-07:002023-02-24T04:32:01.652-08:00Livro C Progressivo (impresso) - Atualizado para 2023<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://clubedeautores.com.br/livro/c-progressivo-2" rel="nofollow"><img border="0" data-original-height="641" data-original-width="453" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnbNoCrDKwzdDTU3BeQ7TLgxs5ZW8YpygWsofgwmgb0-UMERh9f8Y2S4yQbTLTXPkAgn0hGbo_H0ya-Egd-Dyqab1_RwKVfJxMn0f_dIJMLGBzA_c3OMFiWBuAaJkgqazKacFXJYr5hcMP/s640/livro-impresso-c-progressivo.jpg" width="452" /></a></div>
<br />
<div style="text-align: center;">
<a href="https://clubedeautores.com.br/livro/c-progressivo-2"> Obter livro impresso </a></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-23498240887356149542020-02-25T04:35:00.042-08:002023-02-25T05:02:44.027-08:00Como comparar strings em C: Diferenças entre strcmp() e strncmp()<p>Qual a melhor, mais recomendada e mais eficiente maneira de comparar duas strings, em linguagem C?</p><p>Qual função é a mais rápida: strcmp() ou strncmp() ?</p><p>Qual a diferença? O que cada uma faz? Qual maneira é a mais indicada?</p><p><br /></p><h2 style="text-align: left;"><span style="font-size: x-large;">Teste de velocidade: strcmp() ou strncmp() ?</span></h2><p>Sem mais delongas, vamos fazer um simples teste, comparando o tempo de execução das duas funções que comparam strings:</p><ol style="background-color: white; box-sizing: border-box; color: #212529; font-family: monospace; font-size: 12.6px; margin-bottom: 1rem; margin-top: 0px; padding-left: 2rem; white-space: pre;"><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"><span style="box-sizing: border-box; color: #339933;">#include <stdio.h></span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"><span style="box-sizing: border-box; color: #339933;">#include <string.h></span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"><span style="box-sizing: border-box; color: #339933;">#include <time.h></span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> </div></li><li style="box-sizing: border-box; font-weight: bold; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"><span style="box-sizing: border-box; color: #993333;">int</span> main<span style="box-sizing: border-box; color: #009900;">(</span><span style="box-sizing: border-box; color: #009900;">)</span> <span style="box-sizing: border-box; color: #009900;">{</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #993333;">char</span> str1<span style="box-sizing: border-box; color: #009900;">[</span><span style="box-sizing: border-box; color: #009900;">]</span> <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: red;">"Curso C Progressivo"</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #993333;">char</span> str2<span style="box-sizing: border-box; color: #009900;">[</span><span style="box-sizing: border-box; color: #009900;">]</span> <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: red;">"Curso C Progressivo"</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #993333;">long</span> tempo1<span style="box-sizing: border-box; color: #339933;">,</span> tempo2<span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #993333;">int</span> i<span style="box-sizing: border-box; color: #339933;">,</span> j<span style="box-sizing: border-box; color: #339933;">,</span> k<span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; font-weight: bold; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> </div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> tempo1 <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: #000066;">clock</span><span style="box-sizing: border-box; color: #009900;">(</span><span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span> </div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #b1b100;">for</span><span style="box-sizing: border-box; color: #009900;">(</span>i<span style="box-sizing: border-box; color: #339933;">=</span><span style="box-sizing: border-box; color: #0000dd;">0</span> <span style="box-sizing: border-box; color: #339933;">;</span> i<span style="box-sizing: border-box; color: #339933;"><</span><span style="box-sizing: border-box; color: #0000dd;">10000</span> <span style="box-sizing: border-box; color: #339933;">;</span> i<span style="box-sizing: border-box; color: #339933;">++</span><span style="box-sizing: border-box; color: #009900;">)</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> j <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: #000066;">strcmp</span><span style="box-sizing: border-box; color: #009900;">(</span>str1<span style="box-sizing: border-box; color: #339933;">,</span> str2<span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> </div></li><li style="box-sizing: border-box; font-weight: bold; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> tempo2 <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: #000066;">clock</span><span style="box-sizing: border-box; color: #009900;">(</span><span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #000066;">printf</span><span style="box-sizing: border-box; color: #009900;">(</span><span style="box-sizing: border-box; color: red;">"%ld<span style="box-sizing: border-box; color: #000099; font-weight: bold;">\n</span>"</span><span style="box-sizing: border-box; color: #339933;">,</span> tempo2<span style="box-sizing: border-box; color: #339933;">-</span>tempo1<span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> </div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> tempo1 <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: #000066;">clock</span><span style="box-sizing: border-box; color: #009900;">(</span><span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span> </div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #b1b100;">for</span><span style="box-sizing: border-box; color: #009900;">(</span>i<span style="box-sizing: border-box; color: #339933;">=</span><span style="box-sizing: border-box; color: #0000dd;">0</span> <span style="box-sizing: border-box; color: #339933;">;</span> i<span style="box-sizing: border-box; color: #339933;"><</span><span style="box-sizing: border-box; color: #0000dd;">10000</span> <span style="box-sizing: border-box; color: #339933;">;</span> i<span style="box-sizing: border-box; color: #339933;">++</span><span style="box-sizing: border-box; color: #009900;">)</span></div></li><li style="box-sizing: border-box; font-weight: bold; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> j <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: #000066;">strncmp</span><span style="box-sizing: border-box; color: #009900;">(</span>str1<span style="box-sizing: border-box; color: #339933;">,</span> str2<span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> </div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> tempo2 <span style="box-sizing: border-box; color: #339933;">=</span> <span style="box-sizing: border-box; color: #000066;">clock</span><span style="box-sizing: border-box; color: #009900;">(</span><span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"> <span style="box-sizing: border-box; color: #000066;">printf</span><span style="box-sizing: border-box; color: #009900;">(</span><span style="box-sizing: border-box; color: red;">"%ld<span style="box-sizing: border-box; color: #000099; font-weight: bold;">\n</span>"</span><span style="box-sizing: border-box; color: #339933;">,</span> tempo2<span style="box-sizing: border-box; color: #339933;">-</span>tempo1<span style="box-sizing: border-box; color: #009900;">)</span><span style="box-sizing: border-box; color: #339933;">;</span></div></li><li style="box-sizing: border-box; vertical-align: top;"><div style="background: none; box-sizing: border-box; font-size: 1em; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 1.2em; margin: 0px; padding: 0px; vertical-align: top;"><span style="box-sizing: border-box; color: #009900;">}</span></div></li></ol><p>Neste teste, bem rudimentar, fazemos mil comparações, usando as funções. Usamos a biblioteca time.h para usar a função clock(), que pega o tempo atual do sistema, para fazermos uma espécie de cronômetro.</p><p>Resultado dos tempos de execução:</p><p>strcmp: 820<br />strncmp: 866</p><p>Ou seja, strcnmp foi levemente mais rápida, mas <b>neste caso</b>. </p><p><br /></p><h2 style="text-align: left;"><span style="font-size: x-large;">Qual a diferença entre strcmp() e strncmp() ?</span></h2><p>strcmp e strncmp são funções de biblioteca padrão da linguagem C, para comparar strings tanto no C como no <a href="https://www.cmmprogressivo.net" target="_blank">C++</a>. No entanto, eles têm algumas diferenças em termos de desempenho e funcionalidade.</p><p>strcmp compara duas strings terminadas em null e retorna 0 se forem iguais, um valor menor que 0 se a primeira string for lexicograficamente menor que a segunda string e um valor maior que 0 se a primeira string for lexicograficamente maior que a segunda string. Ele compara as duas strings, caractere por caractere, até encontrar uma diferença ou atingir o final de qualquer uma das strings.</p><p>strncmp funciona de forma semelhante a strcmp, mas compara no máximo n caracteres. Isso significa que se n caracteres forem comparados e forem iguais, strncmp retornará 0 mesmo se houver caracteres adicionais em qualquer uma das strings. Isso pode ser útil quando você só precisa comparar uma parte das strings e não deseja comparar a string inteira.</p><p>Em termos de desempenho, strncmp geralmente é mais rápido que strcmp porque compara apenas um número especificado de caracteres, portanto, pode parar antes se as duas strings não forem iguais. No entanto, isso também significa que strncmp pode não fornecer uma comparação precisa de todas as strings. Além disso, se n for definido como um valor grande, strncmp pode ser mais lento que strcmp porque precisa comparar mais caracteres.</p><p>Portanto, a escolha entre strcmp e strncmp depende do seu caso de uso específico. Se você precisar comparar as strings inteiras, strcmp é a função apropriada a ser usada. Se você precisar comparar apenas uma parte das strings, strncmp pode ser mais indicado.</p><p>Vale a pena você conhecer e estudar uma nova função, chamada:</p><p><a href="https://en.cppreference.com/w/c/string/byte/strcpy" rel="nofollow" target="_blank">strcpy_s()</a></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-12393958643392800262019-10-05T10:41:00.001-07:002020-10-25T11:21:56.246-07:00Como Ser Um Programador C ProfissionalProgramar é uma tarefa de amor ou ódio.<br />
Muitos estão aqui estudando por conta de alguma cadeira na faculdade ou algum curso.<br />
<br />
Outros estão aqui por interesse próprio.<br />
Se este for seu caso, certamente já passou pela sua cabeça <b>como se tornar um programador C profissional</b> e trabalhar na área.<br />
<br />
Neste artigo, iremos dar uma importante dica para quem desejar trabalhar como programador.<br />
<br />
Para todo bom iniciante, um bom material complementar faz toda diferença na hora de adquirir conhecimento. <br />
<h2>
<span style="font-size: x-large;">Programador C no Mercado de Trabalho</span></h2>
Para quem gosta do ramo, programar é quase que uma atividade de lazer.<br />
Entender C é entender como funcionam os computadores, como equipamentos eletrônicos trabalham, como são programados, qual sua lógica etc.<br />
<br />
Ou seja, é como se você saísse da "Matrix" e visse como o mundo é feito e como funciona, já que não é nenhum exagero dizer que nossas vidas estão dominadas pela tecnologia.<br />
<br />
Por ser a "linguagem mãe", linguagem na qual os principais Sistemas Operacionais são feitos e muito utilizada para se trabalhar com hardwares e eletrônicos de um modo geral, as possibilidades de trabalho com a linguagem C são muitas, muitas mesmo. Não é a toa que a linguagem mais usada do mundo.<br />
<br />
De fato, não é a linguagem mais simples, pois ela trabalha em um nível mais baixo no seu hardware, que permite que o programador tenha total controle sobre cada bit, o que traz uma responsabilidade maior.<br />
<br />
Porém, esta dificuldade é altamente compensadora, tornando programadores C bem exclusivos e "raros", inclusive no quesito profissional. Ou seja, é comum programadores C terem salários mais altos, pois terão tarefas com maior responsabilidade.<br />
<br />
Neste tutorial, vamos dar mais detalhes para aqueles que desejarem entrar no Mercado de Trabalho como programadores profissionais em C.<br />
São, basicamente, dois passos para que você possa começar a trabalhar como programador C.<br />
<br />
<h2>
<span style="font-size: x-large;"><span style="color: red;">Passo 1</span> para ser programador C: <span style="color: red;">Estudar</span></span></h2>
Não tem segredo.<br />
O primeiro passo é o mais demorado e que exige mais esforço: estude. Estude muito. Mais, e de novo.<br />
<br />
Você está em um site que é um <a href="http://www.cprogressivo.net/" target="_blank">Curso de C</a>.<br />
Devore o conteúdo, faça exercícios, entre em forums, tire dúvidas, responda, assista as vídeo aulas que aconselhamos, baixe as apostilas e tutoriais que fornecemos, tenha na cabeceira de sua cama o livro que indicamos e estude cada página dele.<br />
<br />
Se pensa que é como outras profissões, ondem fazem algum curso, estudam uma vez e estão capacitados pro resto da vida, sinto muito, mas é melhor mudar de profissão.<br />
Programador é estudante de Programação pro resto da vida.<br />
<br />
Você vai sempre estudar, ler tutoriais, notícias, documentação, livros etc.<br />
É uma carreira de aprendizado eterno e constante. Se gosta de programação C, vai adorar isso.<br />
<br />
<h2>
<span style="font-size: x-large;"><span style="color: red;">Passo 2</span> para ser programador C: <span style="color: red;">Prove que estudou</span></span></h2>
Nenhum hospital contrata um médico por ele ter dito que é médico, vão pedir seu diploma e checar no Conselho de Medicina.<br />
Nenhuma empresa também contrata um administrador só por ele dizer que é, ele também precisa provar que estudou e se formou.<br />
<br />
A menos que você monte sua própria empresa e empreenda seu negócio, também vai ser necessário que você prove que estudou C, para ser contratado seja por uma empresa ou para um trabalho freelancer.<br />
Pode ser que tenha feito uma faculdade, curso técnico ou o curso à distância que tenha certificado, mas você precisa mostrar que estudou, de alguma maneira.<br />
<br />
Não vá confundir as coisas. O que vai garantir que você é um bom programador é o tanto que estudou (passo 1), agora o que vai te ajudar a entrar no mercado de trabalho é o passo 2.<br />
<br /><br />
<h2><span style="font-size: x-large;">Curso C Progressivo com Certificado</span></h2>
Se puder, faça um bom segundo grau, estude bastante para o vestibular/ENEM e passe em uma faculdade, e tente obter sua graduação, ainda é o caminho mais comum a seguir para entrar no mercado de trabalho como programador.<br />
<br />
Porém, nem todos podem.<br />
Alguns ainda são muito jovens, outros já tem família, trabalham ou moram em cidades que não possuem um bom curto nessa área.<br />
<br />
Visando essas pessoas, vamos dar uma excelente dica: <b>Buzzero</b>, o maior, melhor e mais confiável sites para estudar online, que emitem <b>certificados</b> válidos em todo território nacional, e também servem como atividade extracurricular<br />
<div class="separator" style="clear: both; text-align: center;"><br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;"><a href="http://bit.ly/CursoCProgressivo" imageanchor="1" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="Curso C Progressivo" border="0" data-original-height="90" data-original-width="728" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaiF0U4wf1rJkfjYlL6GkLtfyJtbccfR0D-Z-cUg_8o1n9YIOJlb918-00PRJVrkb2XqUXw4d-0yn3b0cXG1Ml8G3EPpj5S77IA0IRNf3-suLVi2nhlSa6GPVXub5qtoD96tWFG4B_345a/w640-h80/certificado-curso-c-progressivo-horizontal.jpg" title="Curso de C com certificado" width="640" /></a></div><br /><div>Lá, você conta com conteúdo extra e uma avaliação final, para obter ser certificado e se tornar um programador C Profissional, acesse:</div><div class="separator" style="clear: both; text-align: center;"><a href="http://bit.ly/CursoCProgressivo" imageanchor="1" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="Curso de C online com certificado grátis" border="0" data-original-height="250" data-original-width="300" height="533" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeXRxntvLLIwGQcCw5V7UADkOfFUyGA8OZIP24WqOgPL_AwngJsqO-xu61c-KxOtNOCFaYyVkZbOEW_vtG5ATKUG0vHUTmw8osfuc8KmSn-6n0-Ki11V-gynlbAKS_gKK7q8M3KNTX2BYg/w640-h533/curso-c-progressivo-certificado-retangulo.jpg" title="Curso de C grátis" width="640" /></a></div><br /><div><br /></div><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="http://bit.ly/CursoCProgressivo" imageanchor="1" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img alt="Curso de C online com certificado" border="0" data-original-height="600" data-original-width="160" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBOITT_Oc_ZSq28qDM7DSyTVO1u_1qF-a_DBIJJ1bqXFaygSbgz6gQCM6dbkJiyzbiVhPVM5QgDyY-tXwG3SEhxoh1u0rnb9S6la5i4GTK6Hdm5YgkiG7ioVYjdrIIe2Infu3eWpV8_yS7/w170-h640/curso-c-progressivo-certificado-vertical.jpg" title="Como se tornar um programador C" width="170" /></a></div><br />Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com4tag:blogger.com,1999:blog-6926985245178197542.post-34691942782613108332019-10-04T08:39:00.002-07:002019-10-04T08:39:41.894-07:00O que é Tipografia e sua importância no WeDesign<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhetnyakcQhZA1OvUcSwXsH6U-Jyph3GLSo0OTRnmU86a52tdLcSiBI2MxBDIvxgiY8sRTo4TKWFo8vyJaNUfaKH-59U2SwZCicd9RXKn9C3qf9NryEJbvf8vbrtKL15hzXVAkmRrnJAPv_/s1600/tipografia-webdesign.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="Como usar tipografia em Webdesign" border="0" data-original-height="203" data-original-width="516" height="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhetnyakcQhZA1OvUcSwXsH6U-Jyph3GLSo0OTRnmU86a52tdLcSiBI2MxBDIvxgiY8sRTo4TKWFo8vyJaNUfaKH-59U2SwZCicd9RXKn9C3qf9NryEJbvf8vbrtKL15hzXVAkmRrnJAPv_/s320/tipografia-webdesign.png" title="O que é tipografia" width="320" /></a></div>
Hoje em dia é nítido que ter um site deixou de ser um mero recurso atrativo para se tornar uma prioridade. Tanto uma empresa ou até um profissional freelancer deve contar com um site para assim garantir algo fundamental: a presença digital.<br />
<br />
Na hora de se falar em ter um site, é preciso levar em consideração vários detalhes relevantes. O registro de domínio, por exemplo, é um deles. Graças a um domínio o site ganha muito em credibilidade e profissionalismo.<br />
<br />
<ul>
<li>obs: ainda não tem o seu? <a href="https://www.hostinger.com.br/registro-de-dominio">hostinger.com.br/registro-de-dominio</a>.</li>
</ul>
<br />
Porém além do domínio (e também de um bom serviço de web hosting), a preocupação com o aspecto visual do site não deve ser deixada de lado.<br />
<br />
Assim como todo suporte de informação, um site possui as suas particularidades. Por isso, estabelecer um visual agradável e intuitivo constitui algo que os profissionais da área dão muita importância, que é a Experiência do Usuário.<br />
<br />
Imagine uma loja virtual com imagens pouco detalhadas dos produtos, que não seja responsiva e com links desprovidos de uma hierarquia que facilita a navegação. Tudo isso prejudica o atendimento de qualidade e compromete o futuro do negócio.<br />
<br />
Entretanto, outro grande detalhe que deve ser levado em conta na hora de criar uma identidade visual de sucesso consiste na escolha certa da Tipografia.<br />
<br />
<h2>
<span style="font-size: x-large;">Como a tipografia ajuda um projeto na web</span></h2>
A tipografia está relacionada com a arte e o domínio técnico de compor e arranjar palavras e textos.<br />
<br />
Sabe quando você se depara com um texto e consegue ler o conteúdo sem dificuldade, sem perder a concentração diante elementos que retiram a sua imersão na leitura? Pois então, isso é tudo “culpa” de um bom trabalho de tipografia.<br />
<br />
Será que essa fonte está legível? Será que uma fonte com serifa é a ideal? Essas são algumas das indagações que surgem na mente de um designer gráfico na hora de criar um site.<br />
<br />
A Tipografia sempre foi uma das protagonistas na mídia impressa, pois jornais, livros, revistas e panfletos devem contar com fontes legíveis. Dessa maneira, elas conseguem transmitir com sucesso a mensagem.<br />
<br />
O mesmo vale para os sites, blogs, landing pages e outros formatos que a internet possibilita como suporte para conteúdo textual. A Tipografia é importante em todos os meios de comunicação.<br />
<br />
Por isso, os profissionais da área do design gráfico, que dominam os conceitos de softwares como, por exemplo, o Illustrator da <a href="https://www.adobe.com/">Adobe</a>, devem estar cientes das diferentes características e propósitos das mais variadas fontes tipográficas.<br />
<br />
Cada fonte transmite um conceito diferente. Optar pela fonte ideal na hora de criar uma peça gráfica não pode ser algo feito aleatóriamente. O ideal é que esse procedimento deve estar baseado na mensagem que o designer deseja passar ao leitor.<br />
<br />
Uma tipografia pode ser suave e leve, enquanto outra pode ser pesada e robusta. É o tipo de conteúdo que vai definir qual deverá ser a escolhida.<br />
<br />
Um exemplo de empresa que fez uma mudança sutil na sua tipografia é a <a href="https://www.netflix.com/br/">Netflix</a>. A alteração foi feita em 2014, mudando para um visual mais simples. Sendo assim, confira a seguir alguns dos principais critérios para a escolha de uma boa tipografia.<br />
<br />
<h3>
<ul>
<li>Legibilidade</li>
</ul>
</h3>
A melhor fonte é aquela fácil de ler, e ponto! Esse deve ser um aspecto fundamental na hora de escolher. É aí que entram elementos importantes que orientam a escolha para obter uma boa legibilidade.<br />
<br />
A existência ou não de serifa é um deles. A serifa nas fontes pode ser uma maneira eficiente interessante de orientar a leitura. Por outro lado, a ausência de serifa torna o texto menos sisudo.<br />
<br />
Contudo, é necessário destacar ainda que o tamanho da fonte, aliado a cor em relação aos outros elementos visuais do texto, também é decisivo para assegurar uma boa legibilidade.<br />
<br />
<h3>
<ul>
<li>O espaço de texto</li>
</ul>
</h3>
Quando se trata de trabalhos visuais para a construção de sites e blogs, o texto não tem a necessidade de estar justificado como é e costume em trabalhos acadêmicos, por exemplo.<br />
<br />
<div>
A razão disso é que linhas mais curtas não forçam a leitura em apenas um sentido, tornando o processo de ler mais agradável e pouco cansativo.</div>
<div>
Além disso, não justificar facilita para a responsividade do conteúdo, o tornando adaptável em variados tipos de tela.<br />
<br />
<h3>
<ul>
<li>Hierarquia visual</li>
</ul>
</h3>
Em um texto, algumas frases ou palavras são mais importantes que outras. É aí que um bom designer gráfico atua sabendo trabalhar bem a hierarquia visual.<br />
<br />
De uma forma geral, para destacar algumas frases ou palavras, é válido escrevê-las com a fonte maior ou bold, as priorizando aos olhos do leitor.<br />
<br />
<h3>
<ul>
<li>Funcionalidade</li>
</ul>
</h3>
Por mais bonita que seja uma fonte, será que ela é a mais adequada para o conteúdo do seu trabalho gráfico? Ela casa bem com os outros elementos ou com a “cara” do negócio?<br />
<br />
Uma fonte manuscrita, por exemplo, pode ser interessante para frases curtas, mas poderá ser cansativa para textos mais longos. A ideia é sempre optar pela fonte que trabalhará melhor com os outros elementos e entregará a melhor experiência ao usuário.<br />
<br />
<h2>
<span style="font-size: x-large;">Conclusão</span></h2>
Constantemente são criadas novas fontes tipográficas. Basta procurar pela web em sites com esse propósito e notar a infinidade de opções. No entanto, cabe ao profissional de Design pesquisar e utilizar a mais adequada para o seu trabalho.<br />
<br />
Portanto, diante de uma escolha certa de fontes, a construção visual, seja de um site ou de um material impresso, fica mais atraente, legível e profissional.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-11385693112582682502018-11-08T11:26:00.000-08:002019-09-05T11:22:09.794-07:00Tempos de crise? Aprenda a ganhar dinheiro criando um sitePara muita gente, época de crise é sinônimo de desespero e aflição, enquanto que para outros é a oportunidade perfeita para sair da zona de conforto.<br />
<br />
Em épocas de crise, ficar de braços cruzados, aguardando dias melhores e reclamando da atual situação não é uma alternativa inteligente.<br />
<br />
São em momentos conturbados que é preciso analisar o problema e encontrar uma solução.<br />
Em uma época como a atual, em que a internet é bastante influente, uma das maneiras para driblar a crise é investir na criação de um site.<br />
<br />
<h2>
<span style="font-size: x-large;">Como ganhar dinheiro ao criar um site</span></h2>
<a href="https://www.weblink.com.br/blog/como-criar-um-site/" target="_blank">Poder contar com um site</a> é uma excelente alternativa para profissionais autônomos e pequenas empresas. A interatividade e o alcance de público que um site possui é um ponto positivo para quem quer empreender.<br />
<br />
Contudo, para criar um site e ser bem sucedido nessa empreitada, é importante estar ciente de alguns detalhes básicos, os quais veremos a seguir.<br />
<br />
<h3>
Escolha da plataforma</h3>
Plataformas é o que não faltam para você dar início ao seu projeto online. Atualmente o mercado disponibiliza plataformas gratuitas e de fácil gerenciamento para a construção de diferentes tipos de sites.<br />
<br />
Algumas das mais famosas são o Wix, o Webnode e o Joomla!. Há também o Wordpress, considerada a mais eficiente e preferida de vários usuários, desde os iniciantes aos mais experientes.<br />
<br />
O Wordpress se destaca por ter diversos plugins e uma ampla variedade de templates, detalhes fundamentais para determinar a qualidade do seu projeto.<br />
<br />
Além disso, algumas empresas que atuam oferecendo hospedagem de sites possuem serviços especializados justamente na plataforma Wordpress.<br />
<br />
<br />
<h3>
Escolha da Hospedagem e domínio para o seu site</h3>
E falando em web hosting, a escolha da hospedagem de sites e o registro de domínio também fazem parte dos ingredientes para que o seu projeto tenha êxito.<br />
<br />
Sites mais robustos, que apresentam um tráfego mais elevado, necessitam de um serviço de web hosting qualificado, evitando lentidão no carregamento e até mesmo quedas.<br />
<br />
Um domínio, por sua vez, é o seu endereço na internet. É por meio dele que as pessoas chegarão até você, por isso é importante registrar o seu domínio e assim profissionalizar o seu negócio.<br />
<br />
<h2>
<span style="font-size: x-large;">Alternativas para ganhar dinheiro com o seu site</span></h2>
Se depois de encontrar a plataforma mais adequada e a hospedagem ideal para o seu site, chega a hora de fazer ele render dinheiro. Afinal, em tempos de crise, é preciso agir!<br />
<br />
Sendo assim, selecionamos algumas alternativas que guiarão você nessa missão de contornar transformar a crise em uma oportunidade.<br />
<br />
<h3>
Programa de afiliados</h3>
Quem tem um site ou um blog pode investir em um programa de afiliados. Esse tipo de programa funciona basicamente sobre geração de conteúdos, pois são informações relevantes que vão trazer visitantes para o seu site.<br />
<br />
O seu lucro vai aparecer por meio de links de afiliados. Desse modo, um afiliado vende uma série de produtos e infoprodutos em diversos canais. Os infoprodutos geralmente são e-books, podcasts e vídeo aulas.<br />
<br />
O conteúdo, nesse caso, adquire uma enorme relevância para o sucesso de um programa de afiliados. Afinal, é o conteúdo que faz o visitante ter o interesse nos infoprodutos oferecidos.<br />
<br />
Sendo assim, quem está pensando em investir nesse modelo de negócio pode se perguntar: Qual ou quais produtos vou vender?<br />
<br />
O ideal é definir um nicho, um assunto que você tem interesse e conhecimento sobre ele. Com isso, você vai concentrar o conteúdo produzido e a venda do produto para um público definido.<br />
<br />
<h3>
Invista em um e-commerce</h3>
A compra e a venda via internet cresceu muito nos últimos anos. Muitas pessoas já perderam o medo de adquirir os seus produtos em sites e não abrem mão dessa comodidade.<br />
<br />
Para você investir em um e-commerce a escolha da plataforma vai fazer toda a diferença, afinal, ela será a sua loja onde você vai expor os seus produtos.<br />
<br />
Por isso, ter à disposição uma plataforma com recursos otimizados para o e-commerce se torna um dos requisitos básicos. O Wordpress, por exemplo, conta com recursos adequados para uma loja virtual.<br />
<br />
Há também o Magento, que possui uma grande variedade de recursos, tais como maneiras para você gerenciar o seu estoque, cadastro de produtos e meios de pagamento como cartão de crédito e boleto.<br />
<br />
Lembre-se também que, em se tratando de e-commerce, é fundamental adquirir um plano de hospedagem de sites de qualidade e capaz de suportar um tráfego elevado.<br />
<br />
Além disso, você vai precisar possuir em seu e-commerce o certificado SSL. Ele consiste em um protocolo de segurança e atua protegendo os dados dos seus clientes, tais como senhas, RG e CPF.<br />
<br />
O que você pode vender em um e-commerce são produtos em geral, desde bens alimentícios, artigos tecnológicos e vestuário. Enfim, opções não faltam, basta apenas você escolher o seu nicho.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-28251458146974795632014-05-04T15:12:00.000-07:002018-11-23T09:13:41.949-08:00Filas em C - Como Programar (Tutorial de C sobre Queue - Estrutura de Dados)Neste <a href="http://www.cprogressivo.net/" target="_blank">Tutorial de C</a> de nossa apostila online, vamos falar sobre uma importante <a href="http://www.cprogressivo.net/2013/10/Estrutura-de-dados-dinamica-em-C-Listas-Filas-Pilhas-Arvores.html" target="_blank">estrutura de dados</a> dinâmica, que é a fila.<br />
<br />
Junto com as <a href="http://www.cprogressivo.net/2013/10/Como-fazer-uma-lista-em-C.html" target="_blank">listas encadeadas</a> e as <a href="http://www.cprogressivo.net/2014/05/Pilhas-Stack-em-C-O-Que-E-Como-Implementar-Tutorial-C-Estrutura-de-Dados.html" target="_blank">pilhas em C</a>, formam o conjunto de estrutura de dados mais importantes e usados.<br />
<ul>
<li>Download do curso: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<a name='more'></a><br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Curso de Programação em C, online e com CERTIFICADO! Clique e Obtenha o seu!</a><br />
<br />
<h2>
<span style="font-size: x-large;"><span style="color: red;">Filas em C</span> - Tutorial de Queue</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
As filas (<i>queue</i>, em inglês) são um tipo de estrutura dinâmica de dados onde os elementos (ou nós) estão arranjados em lista que obedece as seguintes regras:<br />
- Ao inserir um nó, ele vai para a última posição da estrutura<br />
- Ao retirar um nó, é tirado o primeiro elemento da estrutura<br />
<br />
Este tipo de estrutura de dados é dita ser <i>FIFO</i> (<i>First in, first out</i>), ou seja, o primeiro elemento a entrar na estrutura é o primeiro a sair.<br />
<br />
O nome <b>fila</b>, por si só, já é auto-explicativo.<br />
Imagine uma fila de banco. A primeira pessoa que chegou na fila, é a que vai ser atendida primeiro.<br />
E se chegar mais alguém? Ela vai demorar mais pra ser atendida.<br />
E se chegar uma outra? Ela será a última a ser atendida, pois quem está na sua frente é atendido antes.<br />
<br />
Ou seja, sempre que inserimos elementos nessa fila, inserimos ao final.<br />
E sempre que retiramos, estamos tirando o primeiro elemento da fila (o mais antigo), pois o que está na frente que vai sair antes.<br />
<br />
Resumindo: inserimos ao fim, e retiramos do começo.<br />
Diferente das <a href="http://www.cprogressivo.net/2014/05/Pilhas-Stack-em-C-O-Que-E-Como-Implementar-Tutorial-C-Estrutura-de-Dados.html" target="_blank">pilhas em C (stack)</a>, onde colocamos no fim e retiramos do fim.<br />
<br />
Simples, não?<br />
Vamos entender agora a lógica para programar uma fila em C, do zero.<br />
<br />
<h2>
<span style="font-size: x-large;"><span style="color: red;">Filas em C</span> - Como Programar a Estrutura de Dados</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<h3>
Função main(), opcao() e menu()</h3>
Ok, agora que já sabemos o que é uma fila e como funciona, vamos começar a implementar essa estrutura de dados em C, partindo do zero, apenas baseado no que sabemos da definição de FIFO.<br />
<br />
Inicialmente criamos uma struct chamada Node, que é vai criar os nós de nossa estrutura de dados.<br />
Vamos colocar nela um inteiro, o "num" para armazenar um valor qualquer inserido pelo usuário.<br />
Obrigatoriamente, temos que inserir nessa struct um ponteiro de seu próprio tipo.<br />
<br />
Vamos chamar esse ponteiro de "prox" pois ele vai servir para apontar para o próximo nó da estrutura.<br />
Caso esse ponteiro aponte para NULL, é porque seu nó é o último da fila ou a fila está vazia.<br />
<br />
De resto, a função principal <b>main()</b> simplesmente fica chamando (em um looping do while) a função menu(), que simplesmente exibe as opções possíveis para se trabalhar com a fila em C.<br />
<br />
Depois que o usuário escolhe o que fazer, sua escolha é enviada para a função <b>opcao()</b>, que usa um teste condicional do tipo switch para invocar a função correta.<br />
<br />
<h3>
Função aloca() e inicia()</h3>
Inicialmente, criamos um ponteiro para a struct Node, é o "FILA", e ele é a representação de nossa estrutura de dados do tipo fila.<br />
Seu inteiro não importa, a função deste ponteiro é definida pelo seu ponteiro "prox".<br />
<br />
O vetor "prox" aponta pro primeiro elemento da fila, e caso ele não exista, a fila está vazia e "prox" aponta para NULL.<br />
Fazemos isso na função <b>inicia()</b>, que inicializa a fila fazendo: FILA->prox = NULL<br />
<br />
Devemos sempre lembrar de alocar memória para cada nó de nossa fila, o que é feito pela função <b>aloca()</b>.<br />
<br />
<h3>
Função vazia()</h3>
No decorrer de nosso programa sobre estrutura de dados do tipo fila, muitas vezes será necessário checar se a fila está vazia ou não.<br />
<br />
Isso é feito de uma maneira bem simples: checando o ponteiro "prox" da struct "FILA".<br />
Se apontar pra NULL, a fila está vazia. Do contrário, tem pelo menos um elemento na fila.<br />
<br />
<h3>
Função insere()</h3>
Antes de mais nada, vamos usar a função aloca() para reservar um espaço em memória para o novo nó, o "novo". Como este novo nó será o último da fila, seu ponteiro "prox" deve apontar para NULL.<br />
Esta foi a primeira parte do processo de se adicionar um elemento em uma fila.<br />
<br />
A segunda parte é adicionar este novo nó ao final da fila, e para tal, devemos achar o último nó da fila.<br />
Primeiro checamos se a fila está vazia, pois se tiver, basta colocar no novo nó em FILA->prox<br />
<br />
Caso não esteja, criamos um ponteiro "tmp" que vai apontar para todos os elementos da fila em busca do último. Ele começa no primeiro elemento, que está em "FILA->prox".<br />
Se "tmp->prox" apontar para NULL, o ponteiro aponta para o último da fila.<br />
Senão, devemos seguir adiante com o ponteiro (tmp = tmp->prox) até acharmos o último elemento.<br />
<br />
Achando, colocamos lá o novo nó, o "novo".<br />
A variável inteira "tam" é para definir o tamanho da fila (número de nós). Usaremos este inteiro na função "exibe()", que vai exibir os elementos da fila.<br />
<br />
<h3>
Função retira()</h3>
Vamos agora retirar um elemento da fila.<br />
E segunda a lógica deste tipo de estrutura de dados, vamos retirar o primeiro nó.<br />
<br />
Antes de tudo, checamos se a fila não está vazia.<br />
Se estiver, trabalho feito, pois não precisaremos retirar nó algum da estrutura de dados.<br />
<br />
Caso a fila não esteja vazia, precisamos identificar o primeiro elemento e o segundo (na verdade, não é obrigado que exista um segundo elemento). O que precisamos fazer é que "FILA->prox" não aponte mais para o primeiro elemento, e sim para o segundo.<br />
<br />
Vamos usar um ponteiro "tmp" para apontar para o primeiro elemento da fila: tmp = FILA->prox<br />
Se "tmp" aponta para o primeiro elemento, então "tmp->prox" aponta para o segundo elemento ou NULL, caso a fila só tenha um nó.<br />
<br />
Agora vamos fazer a ligação entre o ponteiro base (FILA) e o segundo elemento (ou NULL) da fila:<br />
FILA->prox = tmp->prox<br />
<br />
Pronto. Tiramos o primeiro elemento da jogada, pois se ninguém aponta para ele, ele não faz mais parte da estrutura de dados.<br />
Interessante, não?<br />
<br />
Note que declaramos a função "retira()" como sendo do tipo struct Node, pois é uma boa prática retornar o nó que retiramos, pois geralmente retiramos ele da estrutura para fazer algo, trabalhar em cima dele. Depois que retornamos ele pra função "opcao()" liberamos o espaço que havia sido alocado para ele.<br />
<br />
<h3>
Função exibe()</h3>
Esta função serve somente para mostrar os números ("num") existentes em cada nó, para você poder adicionar, retirar e ver o que vai acontecendo com a fila.<br />
Ou seja, esta função tem mais propósitos didáticos, pra você ver as coisas realmente funcionamento na sua frente, como devem funcionar.<br />
<br />
Basicamente pegamos um ponteiro "tmp" e fazemos ele apontar para cada um dos nós, exibindo o número. Para saber o tanto de nós existentes e a ordem, usamos a variável "tam" que é incrementada quando adicionamos nó na fila (função insere) e decrementada quando tiramos elementos da estrutura de dados (função retira).<br />
<br />
<h3>
Função libera()</h3>
Esta função simplesmente tem por objetivo ir em cada nó e liberar a memória alocada.<br />
Para tal, usamos dois ponteiros.<br />
<br />
Um ponteiro aponta para um nó ("atual"), e o outro ponteiro aponta para o nó seguinte ("proxNode").<br />
Liberamos o primeiro ponteiro, ou seja, aquele nó deixa de existir.<br />
Se tivéssemos só este ponteiro, nos perderíamos na fila.<br />
<br />
Porém, o ponteiro que aponta para o nó seguinte da fila serve pra isso, pois agora temos o ponteiro para o próximo elemento da fila "proxNode").<br />
Agora damos um passo pra frente, fazendo um ponteiro apontar para este próximo elemento ("atual = proxNode"), e o ponteiro próximo, para uma posição a frente ("proxNode = proxNode->prox").<br />
<br />
E repetimos o processo até que o nó atual seja NULL (fim da fila).<br />
<br />
<h2>
<span style="font-size: x-large;"><span style="color: red;">Fila em C</span> - Código Fonte Completo</span></h2>
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">struct</span> Node<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> num<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">struct</span> Node <span style="color: #808030;">*</span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">typedef</span> <span style="color: maroon; font-weight: bold;">struct</span> Node node<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> tam<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> vazia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insere<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>retira<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>FILA <span style="color: #808030;">=</span> <span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
inicia<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">do</span><span style="color: purple;">{</span>
opt<span style="color: #808030;">=</span>menu<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
opcao<span style="color: #808030;">(</span>FILA<span style="color: #808030;">,</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Escolha a opcao</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">0. Sair</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">1. Zerar fila</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">2. Exibir fila</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">3. Adicionar Elemento na Fila</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">4. Retirar Elemento da Fila</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Opcao: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> opt<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">switch</span><span style="color: #808030;">(</span>op<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">0</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">1</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
inicia<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">2</span><span style="color: #e34adc;">:</span>
exibe<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">3</span><span style="color: #e34adc;">:</span>
insere<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">4</span><span style="color: #e34adc;">:</span>
tmp<span style="color: #808030;">=</span> retira<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>tmp <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Retirado: </span><span style="color: #0f69ff;">%3d</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
libera<span style="color: #808030;">(</span>tmp<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: #e34adc;"> </span><span style="color: maroon; font-weight: bold;">default</span><span style="color: #e34adc;">:</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Comando invalido</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
tam<span style="color: #808030;">=</span><span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> vazia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">1</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span><span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>novo<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Novo elemento: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insere<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">=</span>novo<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
tam<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>retira<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Fila ja esta vazia</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tam<span style="color: #808030;">-</span><span style="color: #808030;">-</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> tmp<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Fila vazia!</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Fila :</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> tmp <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;"> </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> tam <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;"> ^ </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;">Ordem:</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> tam <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> count<span style="color: #808030;">+</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>FILA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>vazia<span style="color: #808030;">(</span>FILA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>proxNode<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>atual<span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> FILA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>atual <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
proxNode <span style="color: #808030;">=</span> atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>atual<span style="color: #808030;">)</span><span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> proxNode<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span></pre>
Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com13tag:blogger.com,1999:blog-6926985245178197542.post-31758770542652804402014-05-01T15:17:00.002-07:002018-11-23T09:05:20.051-08:00Pilhas (Stack) em C - O Que É e Como Implementar (Tutorial de C Estrutura de Dados)Neste Tutorial de C, vamos falar sobre uma das estrutura de dados mais importantes da computação, que são as pilhas (<i>stack</i>, em inglês).<br />
<br />
Vamos entender o que são pilhas, para que servem, como implementar e programar uma, do zero.<br />
<br />
<a name='more'></a><ul>
<li>Baixe o conteúdo do site: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila de C</a></li>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Certificado do Curso de C - Entre no mercado de trabalho! Seja um Programador Profissional !</a></li>
</ul>
<h2>
<span style="font-size: x-large;"><span style="color: red;">Pilha em C</span> - O Que É e Para Que Serve</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Uma pilha é um tipo de estrutura de dado, que é uma maneira de se organizar e usar dados, informações.</div>
<div>
<br /></div>
<div>
A regra das pilhas é famoso <i>LIFO - Last In, First Out</i>, ou seja, o último a entrar é o primeiro a sair da estrutura.</div>
<div>
<br /></div>
<div>
O nome pilha não é por acaso. Vamos imaginar uma pilha de pratos.</div>
<div>
Sempre que alguém termina de comer, coloca o prato na pilha, sempre acima.</div>
<div>
Ou seja, o último prato a entrar na estrutura, esta sempre no topo.</div>
<div>
<br /></div>
<div>
E na hora de desfazer essa estrutura, essa pilha, que elementos vamos tirar?</div>
<div>
Sempre o prato de cima, que foi o último elemento a entrar na pilha.</div>
<div>
Note que o primeiro prato inserido vai ser o último a sair, pois ele está na base da pilha.</div>
<div>
<br /></div>
<div>
A ideia por trás das pilhas (<i>stack</i>), é de suma importância na estrutura de dados, sendo sua lógica usada em uma infinidade de aplicações. Seu sistema operacional, em níveis de linguagem C e Assembly, está a todo momento usando informações em pilhas para tratar processos e chamadas à funções.</div>
<div>
<br /></div>
<div>
Vamos aprender como fazer uma, na mão, do zero?</div>
<div>
<br /></div>
<div>
<h2>
<span style="font-size: x-large;">Como Programar Uma <span style="color: red;">Pilha em C</span></span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Aqui, vamos explicando, passo a passo, como criar uma <b>pilha em C</b>, do zero, na mão.<br />
Inicialmente vamos comentar tudo que é necessário, toda a lógica, e o código será exibido na próxima parte deste tutorial.<br />
<br />
<h3>
Struct e Cabeçalhos de Funções</h3>
O primeiro passo é a struct, vamos de Node (cada elemento de uma pilha é chamado de nó).<br />
Ela vai ter apenas dois elementos, um número inteiro e um ponteiro para outra struct do tipo Node.<br />
<br />
Esse ponteiro do próprio tipo é obrigatório, não existe estrutura dinâmica de dados sem esse detalhe especial. Na lógica do funcionamento da pilha, vamos entender para que ele serve.<br />
<br />
Já o outro elemento (<b>int num</b>) é só para armazenarmos números nessa pilha, pois vamos pedir e mostrar esses números. Mas note que isso é uma struct, podemos colocar quantos elementos e do tamanho que quisermos, que a pilha vai funcionar do mesmo jeito.<br />
<br />
Também colocamos todos os cabeçalhos das funções que iremos usar para programar a pilha em C, por questões de organização (o código das funções ficará abaixo).<br />
<br />
<h3>
Função main()</h3>
Na função main criamos a nossa pilha, que é uma struct Node, vamos chamar ela de "PILHA", e é a base. Quando o primeiro elemento for adicionado, ele vai ser adicionado no ponteiro "prox" da PILHA.<br />
Este nó, na verdade, não faz parte da pilha, ele serve apenas para indicar onde ela começa (começa no ponteiro na qual ela aponta).<br />
<br />
O resto da main é simplesmente um laço do while, que fica exibindo um menu com as opções para trabalharmos com a pilha, que termina se digitarmos 0.<br />
<br />
<h3>
Função menu() e opcao()</h3>
Essas são as funções responsáveis pela ação, a interação o usuário e a pilha.<br />
<br />
A função menu() simplesmente exibe as opções possíveis e pede um inteiro ao usuário.<br />
Este inteiro será usado e passado para a função opcao(), que junto com a pilha (ponteiro *PILHA) vai servir para chamar a função específica, de acordo com o que o usuário escolheu.<br />
<br />
Na função opcao(), basicamente existe um switch que vai tratar a opção escolhida pela usuário, e chamar a função correta. Sem segredo.<br />
<br />
<h3>
Função inicia()</h3>
Esta função é responsável por inicializar a pilha.<br />
Inicializar é simplesmente preparar a pilha para ser utilizada, simplesmente apontando seu ponteiro *prox para NULL.<br />
<br />
Essa função é chamada automaticamente no início de nosso programa em C, e quando zeramos a pilha.<br />
<br />
<h3>
Função vazia()</h3>
Esta função simplesmente checa se a pilha está vazia ou não.<br />
Basta olhar para onde aponta a base (*PILHA), se apontar para NULL é porque ela está vazia, senão, é porque existem nós nesta estrutura de dados dinâmica.<br />
<br />
<h3>
Função aloca()</h3>
Visando deixar nosso algoritmo bem feito, estruturado e organizado, é interessante separar cada ideia em uma função diferente, com um propósito bem evidente e único.<br />
<br />
A função aloca() é um exemplo dessa organização.<br />
Como o nome sugere, ele serve para alocar nós.<br />
Sempre que formos adicionar um elemento na pilha, temos que alocar memória para ele.<br />
<br />
Essa função aloca a memória necessária pro nó (struct Node), pede o número que o usuário quer armazenar) e retornar o endereço da memória alocada.<br />
<br />
<h3>
Função libera()</h3>
Tão importante quanto alocar memória para cada nó da pilha de nossa estrutura de dados, é liberar esse espaço de memória. A função libera faz isso, vai liberando o espaço alocado de cada nó de nossa pilha.<br />
<br />
Usamos dois ponteiros para a struct do nó, o ponteiro que aponta para o elemento atual e o ponteiro que aponta para o próximo elemento.<br />
Pegamos o ponteiro que aponta para o nó atual e usamos para desalocar aquele espaço de memória, em seguida o ponteiro que apontava para o atual aponta para o próximo, e isso segue até o fim da pilha, desalocando cada um dos nós da estrutura de dados.<br />
<br />
<h3>
Função exibe()</h3>
Essa é a função responsável por exibir todos os elementos da pilha.<br />
Como em cada nó dessa estrutura de dados possui um inteiro que o usuário inseriu, essa função, no fim das contas, vai exibir os números da pilha.<br />
<br />
Essa função declara um ponteiro que vai começar apontando para o primeiro elemento da pilha, exibe o número armazenado ali, pega o endereço do próximo nó, exibe o que está armazenado nele também, e assim se segue, até o fim da pilha (quando *prox aponta para NULL).<br />
<br />
<h3>
Função push()</h3>
Agora vamos a parte que mais interessa em se tratando de estrutura de dados, e especificamente, sobre pilhas em C: as funções push e pop.<br />
<br />
Push em inglês é empurrar, vamos empurrar, colocar um elemento, um nó na pilha.<br />
O primeiro passo é alocar espaço para esteve novo nó da pilha, o que é feito com ajuda da função aloca().<br />
Como é uma pilha, seu último elemento (que é esteve novo), deve apontar para NULL, pois isso caracteriza o fim da pilha.<br />
<br />
Adicionado o elemento, vamos procurar o último elemento da pilha.<br />
Temos o ponteiro *PILHA que aponta para a base.<br />
Se a pilha estiver vazia, ótimo! Fazemos o ponteiro *prox apontar para esteve novo nó, e tudo ok.<br />
<br />
Se a pilha não for vazia, vamos achar o último elemento através de um ponteiro *tmp que vai apontar para o primeiro elemento da pilha (PILHA->prox aponta para o primeiro nó).<br />
<br />
E como sabemos que o nó atual é o último?<br />
Basta checar seu ponteiro *prox, se ele apontar para NULL, ele é último.<br />
Se não apontar, é porque aponta para um novo nó, então fazemos nosso ponteiro *tmp apontar para este novo nó, sempre, até chegar no último.<br />
<br />
Quando "tmp->prox" apontar para NULL, é porque *tmp está apontando para o último nó.<br />
Agora, vamos fazer o próximo nó apontar para nosso novo nó: tmp->prox = novo<br />
E pronto! Função push feita! Adicionamos um novo nó na pilha.<br />
<br />
<h3>
Função pop()</h3>
Agora vamos para a função pop, o outro pilar da estrutura de dados dinâmica que é a pilha.<br />
Esta função vai tirar o último nó da pilha, e retirá-lo de lá.<br />
<br />
Primeiro fazemos uma checagem se a pilha está vazia (PILHA->prox aponta pra NULL).<br />
Se estiver, não há nada a ser feito, pois não há nó para ser retirado da pilha.<br />
<br />
Do contrário, vamos utilizar dois ponteiros para struct Node, o "ultimo" e o "penultimo".<br />
Basicamente, o que vamos fazer é que o "ultimo" aponte para o último elemento da pilha e o "penultimo" aponte para o último nó da pilha.</div>
<div>
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
O motivo disso é simples: vamos retornar o último nó da pilha e vamos retirá-lo da lista (então ele vai se perder, por isso precisaremos sempre do penúltimo, pois este vai se tornar o novo último nó da lista).<br />
<br />
O que vamos fazer é buscar o último nó (que é aquele que tem o ponteiro *prox apontando pra NULL).<br />
E sempre que avançarmos na pilha com o ponteiro "ultimo", fazemos com que o "penultimo" também avance (ora, o penúltimo nó é aquele que tem o ponteiro *prox apontando para o ponteiro *ultimo).<br />
<br />
Essa lógica é feita testando ultima->prox, quando não for NULL, o ponteiro "penultimo" passa a ser o "ultimo" e o "ultimo" vai ser o "ultimo->prox", que é o próximo nó da pilha.<br />
Note que agora que demos um passo a frente na pilha, com os dois ponteiros.<br />
E isso só para quando estivermos apontando para o último e penúltimo nó da pilha.<br />
<br />
Quando estivermos nesse ponto, fazemos "penultimo->prox" apontar para NULL, pois vai caracterizar que o penúltimo nó será, agora, o último nó (pois aponta pra NULL), ou seja: retiramos o último nó da pilha!<br />
<br />
E o que fazemos com o último nó?<br />
Vamos retornar ele! Se estamos tirando ele da pilha, é porque queremos o que tem nele, seja lá pra que for. Então retornamos ele pra função que o chamou (a função opcao()), ela exibe o valor desse último elemento da pilha e então o descarta (liberando a memória dele).<br />
<br />
<h2>
<span style="font-size: x-large;">Código Completo De Uma <span style="color: red;">Pilha em C</span></span></h2>
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">struct</span> Node<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> num<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">struct</span> Node <span style="color: #808030;">*</span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">typedef</span> <span style="color: maroon; font-weight: bold;">struct</span> Node node<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> tam<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> push<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>pop<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>PILHA <span style="color: #808030;">=</span> <span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
inicia<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">do</span><span style="color: purple;">{</span>
opt<span style="color: #808030;">=</span>menu<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
opcao<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">,</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
tam<span style="color: #808030;">=</span><span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Escolha a opcao</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">0. Sair</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">1. Zerar PILHA</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">2. Exibir PILHA</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">3. PUSH</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">4. POP</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Opcao: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> opt<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">switch</span><span style="color: #808030;">(</span>op<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">0</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">1</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
inicia<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">2</span><span style="color: #e34adc;">:</span>
exibe<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">3</span><span style="color: #e34adc;">:</span>
push<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">4</span><span style="color: #e34adc;">:</span>
tmp<span style="color: #808030;">=</span> pop<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>tmp <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Retirado: </span><span style="color: #0f69ff;">%3d</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span></pre>
<pre> <span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: #e34adc;"> </span><span style="color: maroon; font-weight: bold;">default</span><span style="color: #e34adc;">:</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Comando invalido</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> vazia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">1</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span><span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>novo<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Novo elemento: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PILHA vazia!</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PILHA:</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> tmp <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;"> </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> tam <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;"> ^ </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;">Ordem:</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> tam <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> count<span style="color: #808030;">+</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>vazia<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>proxNode<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>atual<span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>atual <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
proxNode <span style="color: #808030;">=</span> atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>atual<span style="color: #808030;">)</span><span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> proxNode<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> push<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>PILHA<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">=</span>novo<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
tam<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>pop<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>PILHA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">PILHA ja vazia</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>ultimo <span style="color: #808030;">=</span> PILHA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>penultimo <span style="color: #808030;">=</span> PILHA<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
penultimo <span style="color: #808030;">=</span> ultimo<span style="color: purple;">;</span>
ultimo <span style="color: #808030;">=</span> ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
penultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
tam<span style="color: #808030;">-</span><span style="color: #808030;">-</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> ultimo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span></pre>
</div>
<br />
<br />
<h2>
<span style="font-size: x-large;">Considerações sobre a Estrutura de Dados Dinâmica Pilha</span></h2>
A ideia por trás da estrutura de dados do tipo pilha é simples: o último elemento a entrar, é sempre o primeiro a sair.<br />
<br />
Existem zilhões de maneiras de se programar uma pilha.<br />
Fizemos apenas uma, que criamos e achamos que é didaticamente interessante de se aprender<br />
<br />
Por exemplo, fizemos uma que possui apenas um elemento fixo, o ponteiro *PILHA, que aponta para a base da pilha. Tente fazer um com o ponteiro *top, que aponta para o topo (final da pilha).<br />
<br />
Se tiver estudado nosso <a href="http://www.cprogressivo.net/2013/10/Como-fazer-uma-lista-em-C.html" target="_blank">Tutorial Sobre Listas Encadeadas em C</a> vai entender bem melhor tudo que foi explicado neste tutorial, e vai notar que uma pilha é uma lista onde os só podemos inserir elementos no fim da lista e só podemos retirar elementos do fim também.<br />
<br />
Ou seja, uma pilha é uma lista também, mas uma lista mais simples, onde só usamos o final dela.<br />
Mais importante que ter todos esses códigos e implementações em C em mente, é ter essas ideias, essa lógica da coisa, de como funciona.Unknownnoreply@blogger.com14tag:blogger.com,1999:blog-6926985245178197542.post-77728505632866405922014-01-26T12:52:00.002-08:002014-01-26T14:11:27.648-08:00Apostila de C - Arquivos, Entra e Saída Padrão (Lista 7)Neste tutorial de nossa <a href="http://www.cprogressivo.net/" target="_blank">Apostila C Progressivo</a>, iremos propor para os leitores de nosso curso uma série de questões que foram criadas pelo Curso de C da UFMG, e presentes em sua apostila, sobre os assuntos de Arquivos, Entrada e Saídas padronizadas em C.<br />
<br />
Em seguida, iremos resolver, dar o gabarito e comentar todos os códigos.<br />
<br />
<a name='more'></a><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obtenha AQUI seu certificado de Programação C</a><br />
<br />
<h2>
<span style="font-size: x-large;">Apostila de C da UFMG</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
As questões deste tutorial são da apostila de C da UFMG, um excelente material didático que está na circulando na internet há mais de 15 anos, e é gratuito e totalmente livre para uso e divulgação.<br />
<br />
A Apostila C Progressivo está resolvendo todos as autoavaliações presentes na apostila da UFMG, e esta é a última lista do curso que é disponibilizado tanto online como em pdf para download.<br />
Para saber mais, veja:<br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Completa-Download-Resolvida-Codigos-Comentados-UFMG.html" target="_blank">Apostila de C</a><br />
<br />
Iremos mostrar os exercícios que são propostos sobre o assunto de <a href="http://www.cprogressivo.net/p/arquivos-em-c.html" target="_blank">Arquivos, Entra e Saída Padrão em C</a>, que são assuntos já explicados na seção de Arquivos de nossa apostila C Progressivo.<br />
<br />
É importante que tenha estudado tais assuntos antes de tentar fazer os testes de autoavaliações.<br />
Não tente chutar ou rodar os códigos dos exercícios, pois assim não irá tirar proveito algum desse excelente material da UFMG.<br />
<br />
Leia, raciocine, faça algum rabisco ou anotação em um papel caso ache necessário, mas tente responder todas as questões.<br />
Somente ao final leia a solução comentada com gabarito.<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Questões sobre Arquivos da Apostila de C</span></h2>
<script>
<!-- hide script from obsolete browsers
function makeArray(length)
{
for (var i=0; i < length; i++)
{
this[i] = 0;
}
this.length = length;
}
var NumQuestions = 10; // Change this value for each test var
ArraySize = NumQuestions + 1;
// Add an extra array element so that we don't have to use index 0. That way
// each question number is its own index into the array.
var questions = new makeArray(ArraySize);
function zeroit()
{
for (var i=0; i < ArraySize; i++)
{
questions[i] = 0;
}
}
function check()
{
var NumCorrect = 0;
var score = 0;
for (var i=1; i < ArraySize; i++)
{
NumCorrect += questions[i];
}
score = 100 * NumCorrect/NumQuestions;
document.question.good.value = score;
}
// end hiding contents -->
</script>
<br />
<div align="center">
</div>
<form name="question">
1- Alguns compiladores indicam que a função <i>gets(string)</i> é uma função
"perigosa". Qual a razão disto? <br />
<ol type="1">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">A função não pode ler inteiros</td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Se string for um vetor de caracteres com poucas posições, o usuário
pode digitar mais caracteres do que a string pode armazenar, causando sérios problemas</td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">O usuário pode digitar algo que não seja caracter e o sistema não
perceber </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">A função não trabalha bem em conjunto com a função scanf </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
2- : O comando printf("%d, %u, %p", i, i, &i); imprimirá: <br />
<ol type="1">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">O endereço de i e o valor de i;</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">O valor de i, de i sem sinal e um ponteiro para i;</td>
</tr>
<tr>
<td><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td><b>c.</b></td>
<td>O valor de i, o valor de i e um ponteiro para i</td>
</tr>
<tr>
<td><input name="a2" onclick="questions[2] =1" type="radio" /></td>
<td><b>d.</b></td>
<td>O valor de i, o valor de i sem sinal e o endereço de i</td>
</tr>
<tr>
<td><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td><b>e.</b></td>
<td>Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
3- Seja a variável <i>double f;</i> qual seria a forma de se efetuar a leitura de f <br />
<ol start="4">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">scanf("%f", &f);</td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">scanf("%6f", &f); </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">scanf("%lf", &f); </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">scanf("%10.6f", &f); </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
4- O que<b> não </b>se pode especificar com a função fopen? <br />
<ol start="4">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">O nome do arquivo a ser aberto; </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Que arquivo será aberto, para acrescentar dados </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Que arquivo será aberto, para trabalhar em modo texto</td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Qual é o ponteiro para o arquivo </td>
</tr>
<tr>
<td><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td><b>e.</b> </td>
<td>Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
5- Para ler um caractere por vez de um arquivo, qual das seguintes funções você
usaria? <br />
<ol start="4">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">getch();</td>
</tr>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">getche();</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] =1" type="radio" /></td>
<td><b>c.</b></td>
<td>getc();</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] =0" type="radio" /></td>
<td><b>d.</b></td>
<td>fgets();</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td><b>e.</b></td>
<td>fread();</td>
</tr>
</tbody></table>
<br />
</ol>
6- Como todos arquivos precisam ser lidos seqüencialmente, não há como ler dados no
meio do arquivo, sem ter feito a leitura desde o seu início. <br />
<ol start="4">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Falso</td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Depende do tipo de arquivo</td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Depende do sistema operacional </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
7- Seja o seguinte trecho de programa <br />
<tt> FILE *fp;</tt> <br />
<tt> fp = fopen("arquivo.txt", "r+");</tt> <br />
O que está sendo feito? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td valign="TOP"><b>a. </b></td>
<td valign="TOP">O arquivo arquivo.tst está sendo aberto em modo texto e somente pode ser
lido.</td>
</tr>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">O arquivo arquivo.tst está sendo fechado para escrita</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td><b>c.</b> </td>
<td>O arquivo arquivo.tst está sendo aberto em modo binário, e pode ser lido ou escrito</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td><b>d.</b> </td>
<td>O arquivo arquivo.tst está sendo aberto em modo binário e somente pode ser lido</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] =1" type="radio" /></td>
<td><b>e.</b> </td>
<td>O arquivo arquivo.tst está sendo aberto em modo texto e pode ser lido ou escrito</td>
</tr>
</tbody></table>
<br />
</ol>
8- Qual a afirmativa errada? <br />
<ol start="4">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">A função fgets() lê uma string de um arquivo, mas também pode ser
utilizada para substituir gets() com segurança</td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">fputs() escreve uma string em um arquivo </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">fputs(string, stdprn) imprimirá a string na impressora padrão </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">fseek() pode ser utilizada para procurar um determinado caractere em um
arquivo</td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
9- Para gravar várias variáveis de tipos diferentes em um arquivo texto, a função
mais apropriada é:: <br />
<br />
<ol start="4">
<br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">fwrite() </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">fprintf()</td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">fputs()</td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">fscanf() </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
10- Seja o seguinte programa: <br />
<tt>#include <stdio.h></tt> <br />
<tt>int main()</tt> <br />
<tt>{</tt> <br />
<tt> FILE *fp;</tt> <br />
<tt> fp = fopen("arquivo.txt", "r");</tt> <br />
<tt> fprintf(fp, "%d", 10);</tt> <br />
<tt> fclose(fp);</tt> <br />
<tt> return(0);</tt> <br />
<tt>}</tt> <br />
<ol start="4">
Qual afirmativa é verdadeira? <br />
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10] =1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Este código compila sem erros</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Ao final da execução, o arquivo arquivo.txt conterá uma linha com o
número 10 impresso nela.</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">A linha #include <stdio.h> não é necessária neste código</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Não se deve usar return 0; neste código, pois a função main não e'
int</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
<a href="https://www.blogger.com/blogger.g?blogID=6926985245178197542" name="verifica"></a><br />
<input onclick="check()" type="button" value="Verifica nota" /><input name="resetMe" onclick="zeroit()" type="reset" value="Limpa" /> <br />
Sua nota é: <input name="good" size="4" type="text" value="0" />em um máximo de
100.
</form>
<br />
<h2>
<span style="font-size: x-large;">Resolução das questões sobre Arquivos da Apostila de C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<h3>
Questão 1:</h3>
Um grande problema da função <b>gets()</b> para pegar uma string do usuário, é que ela não tem nenhuma implementação de segurança, para limitar a quantidade de caracteres digitados pelo usuário.<br />
<br />
Por exemplo, se você declarar uma string de 20 elementos, pode usar a <i>gets()</i> para introduzir, 30, 40 ou 1 milhão de caracteres. Ela deixa, o que a torna muito insegura, pois não sabemos que memória ela vai usar para armazenar os caracteres que extrapolaram o tamanho da string (<i>overflow</i>), sendo essa uma vulnerabilidade muito explorada.<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 2:</h3>
%d imprime um inteiro qualquer, %u imprime um número sem sinal (<i>unsigned</i>) e %p é para ponteiros (exibe o endereço de memória de uma variável através do &).<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 3:</h3>
Uma variável do tipo double é usada para armazenar números com alta precisão decimal, assim como o float, porém o double tem mais precisão, podemos chamar de um <i>long float</i> e usar %lf para armazenar valores neste double.<br />
<br />
Gabarito: <b>c</b><br />
<b><br /></b>
<br />
<h3>
Questão 4:</h3>
Usamos a <a href="http://www.cprogressivo.net/2013/10/Operacoes-com-arquivos-FILE-fopen-modos-de-abertura-fechamento-modo-texto-binario-EOF-fclose-fcloseall.html" target="_blank">função fopen()</a> para abrir arquivos, e para isso passamos o endereço do arquivo na memória do computador, bem como o modo de abertura (para ler, escrever ou adicionar).<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 5:</h3>
A função <b>getc()</b> serve especificamente para capturar um caractere de um arquivo.<br />
<br />
Gabarito: <b>c</b><br />
<b><br /></b>
<br />
<h3>
Questão 6:</h3>
Podemos usar, por exemplo, a função <b>fseek()</b> para acessar um determinado ponto do arquivo.<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 7:</h3>
A letra "r" é de <i>read</i>, ou seja, leitura.<br />
Porém, foi adicionado um +, o que permite abrir o arquivo tanto para leitura como escrita.<br />
<br />
Gabarito: <b>e</b><br />
<b><br /></b>
<br />
<h3>
Questão 8:</h3>
A <b>fseek()</b> é usada para se posicionar no arquivo, e não para leitura ou escrita, e sim para se localizar.<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 9:</h3>
A função <b>printf()</b> é usada para imprimir na tela (saída padrão), já a <b>fprintf()</b> pode ser redirecionada para qualquer saída, como arquivos.<br />
<br />
<h3>
Questão 10:</h3>
Há uma controvérsia nesta questão da apostila.<br />
O curso de C da UFMG diz que a opção correta é a <b>a</b>, que não dá erros ao compilar.<br />
<br />
Porém, note que o arquivo foi aberto para leitura ("r"), e não para a escrita (o código usa a <b>fprinf</b> para escrever). Embora o compilar possa não acusar nada, à rigor isto não está certo.<br />
<br />
Gabarito: <b>a</b> ou <b>e</b>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-8916037920100527992014-01-25T17:10:00.004-08:002014-01-25T20:53:17.484-08:00Apostila de C - Função (Lista 6)Neste tutorial de nossa <a href="http://www.cprogressivo.net/p/curso-de-c-online-para-iniciantes.html" target="_blank">Apostila C Progressivo</a>, vamos propor as questões do Curso de C da UFMG sobre o assunto Função, em seguida iremos comentar e resolver cada um dos exercícios.<br />
<a name='more'></a><br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obtenha seu certificado de C e se torne um programador profissional</a><br />
<br />
<h2>
<span style="font-size: x-large;">Apostila de C da UFMG</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Vamos mostrar neste tutorial as questões que foram propostas pela Apostila de C da UFMG, exercícios sobre Funções onde você deve assinalar a questão correta e, ao final do teste, verificar sua nota.<br />
<br />
Essa apostila é divulgada de maneira gratuita, tanto pelo site como por um pdf que é totalmente liberado para download, impressão e uso. Para saber mais sobre a apostila de C, sua história e onde baixar:<br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Completa-Download-Resolvida-Codigos-Comentados-UFMG.html" target="_blank">Apostila de C</a><br />
<br />
Muito embora algumas questões da apostila possam ser resolvidas simplesmente rodando os códigos, você não irá aprender nada fazendo isso.<br />
Leia os enunciados, raciocine, se precisar pegue um papel e monte sua lógica na cabeça, isso é essencial para você se tornar um bom programador C.<br />
<br />
Em seguida, ao fim deste tutorial, iremos comentar cada uma das questões e resolvê-las explicando detalhadamente cada passo.<br />
<br />
Para resolver as questões, você deve ter estudado o assunto "<a href="http://www.cprogressivo.net/p/funcao-em-linguagem-de-programacao-c.html" target="_blank">Função em C</a>", que é extensamente explicado na dita seção de nosso site.<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Questões sobre Função da Apostila de C</span></h2>
<script>
<!-- hide script from obsolete browsers
function makeArray(length)
{
for (var i=0; i < length; i++)
{
this[i] = 0;
}
this.length = length;
}
var NumQuestions = 10; // Change this value for each test var
ArraySize = NumQuestions + 1;
// Add an extra array element so that we don't have to use index 0. That way
// each question number is its own index into the array.
var questions = new makeArray(ArraySize);
function zeroit()
{
for (var i=0; i < ArraySize; i++)
{
questions[i] = 0;
}
}
function check()
{
var NumCorrect = 0;
var score = 0;
for (var i=1; i < ArraySize; i++)
{
NumCorrect += questions[i];
}
score = 100 * NumCorrect/NumQuestions;
document.question.good.value = score;
}
// end hiding contents -->
</script>
<br />
<br />
<form name="question">
1- Qual a afirmativa verdadeira? <br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Você pode retornar para um programa quantas variáveis de uma função
desejar através do comando return </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Uma função só pode ter um comando return </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Os protótipos de função servem para declarar as funções, isto é,
indicar para o compilador qual o seu nome, tipo de retorno e o número e tipos dos
parâmetros </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Uma função não pode retornar um ponteiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
2- : Qual das seguintes razões não é uma razão válida para o uso de funções em
C? <br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Funções usam menos memória do que se repetirmos o mesmo código
várias vezes</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Funções rodam mais rápido </td>
</tr>
<tr>
<td><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td><b>c.</b></td>
<td>Funções fornecem um meio de esconder cálculos em uma "caixa preta" que
pode ser usada sem a preocupação de detalhes internos de implementação</td>
</tr>
<tr>
<td><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td><b>d.</b></td>
<td>Funções mantêm variáveis protegidas das outras partes do programa</td>
</tr>
</tbody></table>
<br />
</ol>
3- Qual a afirmativa falsa? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Se uma função não retorna nada ela deve ser declarada como void</td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">O retorno da função main é feito para o sistema operacional </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">stdio.h e string.h contêm o protótipo de algumas funções da
biblioteca do C </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Funções podem ser definidas dentro de outras funções </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Uma das opções anteriores é falsa</td>
</tr>
</tbody></table>
<br />
</ol>
4- Qual a afirmativa verdadeira? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">stdio.h e string.h contêm o corpo de algumas funções da biblioteca do
C </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Funções podem ser chamadas por outras funções </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Em um programa C todas as funções de um programa devem estar em um
único arquivo .c</td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Variáveis declaradas em uma função são acessíveis por todas as
outras funções </td>
</tr>
<tr>
<td><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td><b>e.</b> </td>
<td>Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
5- Qual a afirmativa verdadeira? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5] =1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">A palavra reservada auto é utilizada para dizer que uma variável é
local (automática). Porém, ela pode ser omitida dentro de uma função, pois todas as
variáveis são locais por default.</td>
</tr>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Não se pode utilizar variáveis com o mesmo nome em funções
diferentes.</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td><b>c.</b></td>
<td>Os parâmetros recebidos por uma função têm o mesmo endereço das variáveis usadas
na chamada à função</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] =0" type="radio" /></td>
<td><b>d.</b></td>
<td>Quando uma variável local tem o mesmo nome de uma variável global, a variável local
se torna inacessível e a variável global é acessível</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td><b>e.</b></td>
<td>Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
6- Qual a afirmativa falsa? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Os parâmetros recebidos por uma função armazenam cópias das
variáveis usadas na chamada da função </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Variáveis globais são conhecidas e podem ser alteradas por todas as
funções do programa</td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Quando queremos alterar as variáveis que são passadas como parâmetros
para uma função, devemos declará-las como ponteiros na função</td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">A função scanf necessita receber como parâmetro o endereço da
variável de entrada, porque ela precisa alterar esta variável. </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=1" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Uma das opções anteriores é falsa</td>
</tr>
</tbody></table>
<br />
</ol>
7- O que imprime o programa abaixo? <br />
<tt> #include <stdio.h></tt> <br />
<tt> void func();</tt> <br />
<tt> int i = 10;</tt> <br />
<tt> void main()</tt> <br />
<tt> {</tt> <br />
<tt> int i=20;</tt> <br />
<tt> func();</tt> <br />
<tt> printf("i= %d ", i);</tt> <br />
<tt> {</tt> <br />
<tt> int i = 30;</tt> <br />
<tt> func();</tt> <br />
<tt> printf("i= %d
", i);</tt> <br />
<tt> }</tt> <br />
<tt> }</tt> <br />
<tt> void func()</tt> <br />
<tt> {</tt> <br />
<tt> printf("i = %d ", i);</tt> <br />
<tt> }</tt> <br />
<tt> </tt> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td valign="TOP"><b>a. </b></td>
<td valign="TOP">i= 20 i= 20 i= 30 i= 30</td>
</tr>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">i= 10 i= 20 i=10 i= 30</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td><b>c.</b> </td>
<td>i= 20 i=10 i=10 i=30</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td><b>d.</b> </td>
<td>i= 10 i=10 i=10 i=10</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] =0" type="radio" /></td>
<td><b>e.</b> </td>
<td>Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
8- Ao se utilizar um vetor como parâmetro para uma função que informação está
sendo passada à função? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Uma cópia de todos elementos do vetor</td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Uma cópia do primeiro elemento do vetor </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">O endereço do primeiro elemento do vetor </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">O endereço de todos os elementos do vetor </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
9- Sejam par1, par2 e par3 variáveis inteiras. Se chamarmos uma função pela
instrução: <br />
<span style="font-family: Courier New,Courier;">
func(&par1,&par2,&par3);</span> <br />
Para que servem &par1, &par2 e &par3 ? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">São valores inteiros passados para a função </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Servem para armazenar os endereços da função e das funções que
chamaram</td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">São os endereços das variáveis da função que chamou. Nestes
endereços iremos armazenar os valores a serem modificados pela função</td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Armazenam os endereços das funções de biblioteca usados na
função </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<br />
</ol>
10- O que imprime o programa a seguir? <br />
<tt> #include <stdio.h></tt> <br />
<tt> func(int *a, int b)</tt> <br />
<tt> {</tt> <br />
<tt> int temp;</tt> <br />
<tt> temp = *a;</tt> <br />
<tt> *a = b;</tt> <br />
<tt> b = temp;</tt> <br />
<tt> }</tt> <br />
<tt> void main()</tt> <br />
<tt> {</tt> <br />
<tt> int a = 10, b = 20;</tt> <br />
<tt> func(&a, b);</tt> <br />
<tt> printf("a = %d, b = %d", a, b);</tt>
<br />
<tt> }</tt> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">a = 10, b = 20</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">a = 20, b = 10</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">a = 10, b = 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">a = 20, b = 20</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
<a href="https://www.blogger.com/blogger.g?blogID=6926985245178197542" name="verifica"></a><br />
<input onclick="check()" type="button" value="Verifica nota" /><input name="resetMe" onclick="zeroit()" type="reset" value="Limpa" /> <br />
Sua nota é: <input name="good" size="4" type="text" value="0" />em um máximo de
100. <br />
<br /></form>
<h2>
<span style="font-size: x-large;">Solução dos exercícios de Função da Apostila de C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<h3>
Questão 1:</h3>
Somente a afirmativa sobre os protótipos é verdadeira.<br />
Podemos fazer retorno de apenas uma variável, que pode ser uma struct ou vetor com vários elementos, mas retorna somente uma variável, de qualquer tipo que for.<br />
<br />
Há também uma pegadinha nessa questão da apostila, sobre o tanto de comandos <i>return</i> que podem existe. Na verdade, somente um comando return vai ser executado, mas podem existir mais de um.<br />
Por exemplo:<br />
if (condição) return variavel1;<br />
else return variavel2;<br />
<br />
Ou imagine um retorno diferente para cada <i>case</i> de um <i>switch</i>. Assim, podem existir vários <i>return</i> dentro de uma função, mas ó um deles vai ser executado.<br />
<br />
Gabarito: <b>c</b><br />
<b><br /></b>
<br />
<h3>
Questão 2:</h3>
Na verdade, o uso de funções em linguagens de programação deixa o programa um pouco mais lento.<br />
Ele facilita bastante a vida do programador, deixa o código bem mais compacto, de fácil leitura e entendimento, mas não é recomendado usar em excesso.<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 3:</h3>
Não é possível declarar uma função dentro de outra.<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 4:</h3>
<br />
Arquivos com a extensão .h são ditos <i>headers</i>, pois contém o cabeçalho de funções que pode sem implementadas em diversos arquivos, os módulos .c<br />
<br />
Devemos lembrar também que as variáveis locais, que são declaradas dentro de uma função, "morrem" nela, não sendo visíveis fora dela.<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 5:</h3>
Podemos usar variáveis de mesmo nome, desde que elas sejam locais e pertençam a funções diferentes, pois elas só serão visíveis dentro do escopo da função.<br />
<br />
Os parâmetros recebidos numa função, quando a passagem é por valor, são cópias das variáveis originais, ou seja, endereços diferentes das originais.<br />
<br />
Gabarito: <b>a</b><br />
<b><br /></b>
<br />
<h3>
Questão 6:</h3>
As alternativas <b>a</b>, <b>b</b>, <b>c</b> e <b>d</b> são corretas.<br />
<br />
Gabarito: <b>e</b><br />
<b><br /></b>
<br />
<h3>
Questão 7:</h3>
A primeira coisa a ser impressa é: i=10<br />
Pois a função <b>func()</b> só sabe da variável "i" global, que tem valor 10. Ela não tem acesso à variável "i" que está dentro da função <b>main()</b>.<br />
<br />
Depois ocorre uma impressão da variável local da <b>main</b>, i=20<br />
Depois a <b>func()</b> imprime a variável "i" global novamente: i=10<br />
Por fim, é exibida a variável local "i" dentro dos colchetes, onde lá dentro, e somente lá, i=30<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 8:</h3>
Repetindo mais uma vez em nossa apostila: quando passamos, recebemos e declaramos vetores, estamos apenas trabalhando com o endereço de memória do primeiro elemento.<br />
<br />
Gabarito: <b>c</b><br />
<b><br /></b>
<br />
<h3>
Questão 9:</h3>
Estamos fazendo uma passagem por referência, ou seja, estamos passando os endereços das variáveis, e não uma cópia. Nesse caso podemos alterar os valores das variáveis originais dentro do escopo de uma função.<br />
<br />
Gabarito: <b>c</b><br />
<b><br /></b>
<br />
<h3>
Questão 10:</h3>
Essa é mais uma questão do tipo pegadinha, dessa apostila.<br />
Como estamos trabalhando com ponteiro e endereço da memória da variável "a", ela será alterada de dentro da função <b>func()</b>, porém a variável "b" é passada por valor, ou seja, a função vai usar uma cópia do valor de "b", e não a variável "b" em si, que permanecerá intocada.<br />
<br />
Dentro da função, "a" recebe o valor de "b".<br />
"b" continua do jeito que está.<br />
<br />
Gabarito: <b>d</b>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-10856701563050503852014-01-25T12:14:00.001-08:002014-01-25T13:34:01.108-08:00Apostila de C - Ponteiros, Vetores, Matrizes e Strings (Listas 4 e 5)Neste tutorial de nossa <a href="http://www.cprogressivo.net/" target="_blank">Apostila C Progressivo</a>, iremos exibir as questões da apostila de C da UFMG sobre os assuntos de Ponteiros, Vetores, Matrizes e Strings, e em seguida iremos comentar cada uma das questões, códigos e dar o gabarito correto dos exercícios.<br />
<a name='more'></a><br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" target="_blank">Obtenha aqui seu certificado do Curso de C!</a><br />
<br />
<h2>
<span style="font-size: x-large;">Apostila de C da UFMG</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
As questões que apresentaremos neste tutorial de nosso curso, são de autoria da UFMG, da famosa "Apostila de C da UFMG", que foi um material usado para o Curso de C de Universidade de Minas Gerais, e que hoje em dia é um material gratuito e totalmente liberado para quaisquer uso.<br />
<br />
A apostila de C da UFMG é um material de altíssima qualidade, que há mais de 15 anos vem formando e treinando toda uma geração de programadores em linguagem C.<br />
<br />
Para saber mais sobre o material, download, como acessar online e sobre o curso:<br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Completa-Download-Resolvida-Codigos-Comentados-UFMG.html" target="_blank">Apostila de C</a><br />
<br />
Nessas questões da apostila serão necessários conhecimentos nos seguintes assuntos:<br />
<ul>
<li><a href="http://www.cprogressivo.net/p/vetores-em-linguagem-c.html" target="_blank">Vetores (ou arrays) e Matrizes (ou vetores multidimensionais)</a></li>
<li><a href="http://www.cprogressivo.net/p/aprenda-tudo-sobre-ponteiros-em-c.html" target="_blank">Ponteiros</a></li>
<li><a href="http://www.cprogressivo.net/p/strings-e-caracteres-em-c.html" target="_blank">Strings (ou vetores de caracteres)</a></li>
</ul>
<br />
A própria apostila de C, original, da UFMG, decidiu fundir os assuntos de ponteiros, vetores, matrizes e strings e colocar os exercícios juntos, pois estes assuntos estão bem correlatos entre si.<br />
<br />
Muitas questões dessa lista da apostila podem ser resolvidas simplesmente rodando o código apresentado, porém isso não adiantará de nada, você não aprenderá nada com isso.<br />
Nossa sugestão é que leia e raciocine, se precisa use papel e lápis.<br />
<br />
Antes de um código rodar no computador, ele tem que rodar na sua cabeça, tem que fazer sentido para você.<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Exercícios da Apostila de C (Listas 4 e 5)</span></h2>
<script>
<!-- hide script from obsolete browsers
function makeArray(length)
{
for (var i=0; i < length; i++)
{
this[i] = 0;
}
this.length = length;
}
var NumQuestions = 12; // Change this value for each test var
ArraySize = NumQuestions + 1;
// Add an extra array element so that we don't have to use index 0. That way
// each question number is its own index into the array.
var questions = new makeArray(ArraySize);
function zeroit()
{
for (var i=0; i < ArraySize; i++)
{
questions[i] = 0;
}
}
function check()
{
var NumCorrect = 0;
var score = 0;
for (var i=1; i < ArraySize; i++)
{
NumCorrect += questions[i];
}
score = 100 * NumCorrect/NumQuestions;
document.question.good.value = score;
}
// end hiding contents -->
</script>
<br />
<hr />
<form name="question">
<br />
<br />
<br />
1- Seja um vetor declarado por
<br />
<tt> int vet[10];</tt>
<br />
Qual elemento deste vetor é acessado quando
se escreve vet[2] ?
<br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">Primeiro elemento </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">Segundo elemento </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">Terceiro elemento </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">Quarto elemento </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br /> </ol>
2- Se declararmos um vetor como:
<tt> int vet[30]</tt>
<br />
a instrução abaixo acessa corretamente
os elementos deste vetor?
<br />
<tt> for (j=0; j <= 30; j++)</tt>
<br />
<tt> vet[j] = j*j;</tt>
<br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">Sim</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">Não </td>
</tr>
</tbody></table>
<br /> </ol>
3- Seja a matriz matrx declarada e inicializada por:
<tt> int matrx[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};</tt>
<br />
O que conterá o elemento matrx[1][2] ?
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">2</td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">5 </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">6 </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">7 </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br /> </ol>
4- Se uma string for declarada como:
char str[20];
<br />
o número máximo de caracteres que poderão ser lidos
e armazenados nela é:
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">18 </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">19 </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">20</td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">21 </td>
</tr>
</tbody></table>
<br /> </ol>
5- Qual função pode ser usada para determinar o comprimento
de uma string?
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">gets</td>
</tr>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">strcpy</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td><b>c.</b></td>
<td>strcat</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] =1" type="radio" /></td>
<td><b>d.</b></td>
<td>strlen</td>
</tr>
<tr>
<td><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td><b>e.</b></td>
<td>strcmp</td>
</tr>
</tbody></table>
<br /> </ol>
6- Qual das instruções abaixo é correta para declarar
um ponteiro para inteiro?
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">*int pti; </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">*pti;</td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">&i; </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">int_pti pti; </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=1" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">int *pti; </td>
</tr>
</tbody></table>
<br /> </ol>
7- Seja a seguinte seqüência de instruções
em um programa C:
<tt> int *pti;</tt>
<br />
<tt> int i = 10;</tt>
<br />
<tt> pti = &i;</tt>
<br />
Qual afirmativa é <b>falsa</b>?
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td valign="TOP"><b>a. </b></td>
<td valign="TOP">pti armazena o endereço de i </td>
</tr>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">*pti é igual a 10 </td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td><b>c.</b></td>
<td>ao se executar *pti = 20; i passará a ter o valor 20</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td><b>d.</b></td>
<td>ao se alterar o valor de i, *pti será modificado</td>
</tr>
<tr>
<td><input name="a7" onclick="questions[7] =1" type="radio" /></td>
<td><b>e.</b></td>
<td>pti é igual a 10</td>
</tr>
</tbody></table>
<br /> </ol>
8- Se i e j são variáveis inteiras e pi e pj são ponteiros
para inteiro, qual atribuição <b>é ilegal</b>?
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">pi = &i; </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">*pj = &j; </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">pj = &*&j; </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">i = *&*&j; </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">i = (*pi)+++*pj; </td>
</tr>
</tbody></table>
<br /> </ol>
9- Seja a seguinte seqüência de instruções em
um programa C:
<span style="font-family: Courier New,Courier;">
int *pti;</span>
<br />
<span style="font-family: Courier New,Courier;">
int veti[]={10,7,2,6,3};</span>
<br />
<span style="font-family: Courier New,Courier;">
pti = veti;</span>
<br />
Qual afirmativa é <b>falsa</b>?
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">*pti é igual a 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">*(pti+2) é igual a 2 </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">pti[4] é igual a 3</td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">pti[1] é igual a 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">*(veti+3) é igual a 6</td>
</tr>
</tbody></table>
<br /> </ol>
10- Na seqüência de instruções abaixo:
float f;
<br />
float *pf;
<br />
pf = &f;
<br />
scanf("%f", pf);
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10] = 1" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">Efetuamos a leitura de f</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">Não efetuamos a leitura de f</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">Temos um erro de sintaxe </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">Deveríamos estar usando &pf no scanf </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br /> </ol>
11- Seja a seguinte seqüência de instruções
<span style="font-family: Courier New,Courier;"> int
i=10, j=20;</span>
<br />
<span style="font-family: Courier New,Courier;"> int
*pti, *ptj;</span>
<br />
<tt> pti = &i;</tt>
<br />
<tt> ptj = &j;</tt>
<br />
Qual expressão <b>não é válida</b>?
<br />
<ol start="4">
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">j = pti == ptj;</td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">i = pti-ptj; </td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">pti += ptj;</td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">pti++; </td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">i = pti || ptj; </td>
</tr>
</tbody></table>
<br /> </ol>
12- Seja a declaração:
<tt> int matr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}</tt>
<br />
Qual afirmativa é falsa?
<br />
<ol start="4">
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b></td>
<td valign="TOP">**matr é igual a 1</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b></td>
<td valign="TOP">*(*(matr+1)+2) é igual a 7 </td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b></td>
<td valign="TOP">*(matr[2]+3) é igual a 12</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b></td>
<td valign="TOP">(*(matr+2))[2] é igual a 11</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=1" type="radio" /></td>
<td valign="TOP"><b>e.</b></td>
<td valign="TOP">*((*matr)+1) é igual a 5</td>
</tr>
</tbody></table>
<a href="https://www.blogger.com/blogger.g?blogID=6926985245178197542" name="verifica"></a></ol>
<input onclick="check()" type="button" value="Verifica nota" /><input name="resetMe" onclick="zeroit()" type="reset" value="Limpa" />
Sua nota é: <input name="good" size="4" type="text" value="0" />em
um máximo de 100.
</form>
<br />
<h2>
<span style="font-size: x-large;">Solução comentada dos exercícios da Apostila de C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<h3>
Questão 1:</h3>
Em vetores, o primeiro elemento é sempre o 0.<br />
Assim, temos: vet[0], vet[1], vet[2], ..., vet[9]<br />
Logo, o vet[2] é um terceiro elemento do vetor.<br />
<br />
Gabarito: <b>c</b><br />
<b><br /></b>
<br />
<h3>
Questão 2:</h3>
Se você declaram um vetor de 30 elementos, eles são: vet[0], vet[1], ..., vet[29]<br />
Ou seja, não existe: vet[30]<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 3:</h3>
<br />
Temos um vetor bidimensional, ou matriz, com 12 elementos.<br />
Não foi especificado na declaração dela o tanto de linhas que ela possui, somente o número de elementos existentes em cada linha, que é 4.<br />
<br />
Ou seja, temos 12 elementos, agrupados de 4 em 4. Logo, temos 3 linhas:<br />
matrx[0][], matrx[1] e matrx[2]<br />
<br />
Desenhando nossa matriz para resolver esta questão da apostila, temos:<br />
matrx[][0] matrx[][1] matrx[][2] matrx[][3]<br />
matrx[0] -> 1 2 3 4<br />
matrx[1] -> 5 6 7 8<br />
matrx[2] -> 9 10 11 12<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 4:</h3>
Embora as strings sejam comumente vistas como um vetor de caracteres, esta informação não está totalmente correta, pois o que caracteriza uma string é que o último elemento do vetor é o caractere '\0', e não um caractere visível.<br />
<br />
Assim, se declaramos uma string com 20 elementos, só podemos usar 19, pois o último é o \0.<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 5:</h3>
<b>strlen</b> vem de <i>string length</i>, que significa tamanho da string.<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 6:</h3>
A sintaxe para declaração de um ponteiro é:<br />
<i>tipo_do_ponteiro</i> * <i>nome_do_ponteiro;</i><br />
<i><br /></i>
Gabarito: <b>e</b><br />
<b><br /></b>
Questão 7:<br />
<i>pti</i> não é igual a 10, pois <i>pti</i> armazena um endereço de memória, um tipo de dado especial, diferente de um inteiro comum.<br />
<br />
Gabarito: <b>e</b><br />
<b><br /></b>
<br />
<h3>
Questão 8:</h3>
Como dissemos, o endereço de memória é um tipo especial de dado, não é exatamente igual a inteiro.<br />
Sabemos que *pj vai mudar o local na qual o ponteiro <i>pj</i> aponta.<br />
Por exemplo, vamos fazer <i>pj</i> apontar para a variável <i>j</i>: pj = &j;<br />
<br />
Assim, fazer: j=10<br />
É o mesmo que: *pj = 10<br />
Pois pj aponta para j.<br />
<br />
Então, *pj é um número inteiro, e ele deve receber um inteiro, e nessa opção ele recebe dado do tipo endereço de memória: *pj = &j<br />
<br />
Gabarito: <b>e</b><br />
<b><br /></b>
<br />
<h3>
Questão 9:</h3>
Um vetor, na verdade, é um ponteiro, um ponteiro que aponta para seu primeiro elemento.<br />
Por isso que fazemos: pti = veti , em vez de pti = &veti<br />
<br />
Assim, ao fazer "pti = veti", é fazer o ponteiro <i>pti</i> apontar para o primeiro elemento do vetor.<br />
Logo, pti[0] = veti[0] = 10<br />
E, pti[1] = veti[1] = 7<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 10:</h3>
<br />
Para usarmos a função <b>scanf</b> para a leitura de um número do teclado, devemos fornecer para ela um endereço de memória, de onde essa variável vai ser armazenada.<br />
<br />
E como fornecemos um endereço de memória? Através do operador & antes de uma variável, ou através de um ponteiro, pois este ponteiro armazena um endereço de memória.<br />
<br />
Assim, fornecer <i>pf</i> ou <i>&f</i> é a mesma coisa.<br />
<br />
Gabarito: <b>a</b><br />
<b><br /></b>
<br />
<h3>
Questão 11:</h3>
O resultado da operação de soma ou subtração de ponteiros, é um inteiro.<br />
Por isso, é verdadeira a instrução: i = pti - ptj;<br />
Assim, (pti + ptj) também seria um inteiro, logo fazer: pti += ptj é errado, pois é fazer com que pti receba (pti + ptj) que é um inteiro.<br />
<br />
Gabarito: <b>c</b><br />
<b><br /></b>
<br />
<h3>
Questão 12:</h3>
Desenhando a matriz:<br />
matrx[][0] matrx[][1] matrx[][2] matrx[][3]<br />
matr[0] -> 1 2 3 4<br />
matr[1] -> 5 6 7 8<br />
matr[2] -> 9 10 11 12<br />
<br />
Sabemos que um vetor é, na verdade, um ponteiro.<br />
Assim, uma matriz é um conjunto de ponteiros, ou um ponteiro de ponteiros.<br />
É tanto que podemos representar essa matriz por: **matr (um ponteiro que aponta para ponteiros), desenhando:<br />
<br />
matr[0] -> *ptr<br />
matr[1] -> *ptr<br />
matr[2] -> *ptr<br />
<br />
Assim, **matr aponta para o primeiro elemento, 1.<br />
Para apontarmos para a segunda linha: *( *(ptr+1) ) ou *( ptr[1] )<br />
Para apontar para a segunda coluna: *( *(ptr) + 1 ) ou *( *ptr)[1]<br />
Para apontar para a segunda linha e terceira coluna: *( *(ptr+1) + 2 )<br />
<br />
<span style="font-family: inherit;">Portanto, é fácil ver que <span style="background-color: white; line-height: 18px;">*((*matr)+1) aponta para a primeira linha e segunda coluna, o elemento 6 (e não 5).</span></span><br />
<span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"><br /></span>
<span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;">Gabarito: <b>e</b></span>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-21407860175310104182014-01-24T17:46:00.000-08:002014-01-24T21:12:20.744-08:00Apostila de C - Testes Condicionais (IF-ELSE e SWITCH-CASE), Laços (FOR e WHILE) e Operador Ternário (? :) (Lista 3)Neste tutorial de nossa <b>Apostila C Progressivo</b>, iremos mostrar as questões da apostila de C da UFMG sobre os Testes Condicionais IF ELSE e SWITCH, Laços ou loopings WHILE e FOR e do Operador Ternário em C: <condição> ? <operação 1> : <operação 2> ;<br />
<a name='more'></a><br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" target="_blank">Seja um programador profissional. Clique aqui e obtenha seu CERTIFICADO</a><br />
<br />
<h2>
<span style="font-size: x-large;">Apostila de C da UFMG</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Neste artigo de nosso curso, iremos mostrar todas as questões propostas na Lista 3 da Apostila de C da UFMG, onde, inicialmente, você deve resolver os exercícios propostos e marcar as alternativas que achar correto.<br />
Em seguida você deverá ver a nota que tirou.<br />
<br />
Na segunda parte deste artigo, iremos resolver e analisar cada uma das questões propostas nessa lista da apostila, e vamos comentar bem os códigos dos exercícios.<br />
A UFMG disponibiliza todo esse material de maneira gratuita e livre para estudo e divulgação, para saber mais:<br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Completa-Download-Resolvida-Codigos-Comentados-UFMG.html" target="_blank">Apostila de C da UFMG</a><br />
<br />
Para você resolver as questões dessa lista da apostila, é necessário ter estudado os tutoriais da seção sobre <a href="http://www.cprogressivo.net/p/testes-condicionais-e-controle-de-fluxo.html" target="_blank">Testes Condicionais e Laços</a>.<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
Apostila de C - Exercícios sobre Testes e Laços (Lista 3)</h2>
<script>
<!-- hide script from obsolete browsers
function makeArray(length)
{
for (var i=0; i < length; i++)
{
this[i] = 0;
}
this.length = length;
}
var NumQuestions = 12; // Change this value for each test var
ArraySize = NumQuestions + 1;
// Add an extra array element so that we don't have to use index 0. That way
// each question number is its own index into the array.
var questions = new makeArray(ArraySize);
function zeroit()
{
for (var i=0; i < ArraySize; i++)
{
questions[i] = 0;
}
}
function check()
{
var NumCorrect = 0;
var score = 0;
for (var i=1; i < ArraySize; i++)
{
NumCorrect += questions[i];
}
score = 100 * NumCorrect/NumQuestions;
document.question.good.value = score;
}
// end hiding contents -->
</script>
<br />
<form name="question">
<br />
<br />
1- <span style="font-family: Courier New,Courier;">if(num) ...;</span> é
equivalente a <span style="font-family: Courier New,Courier;">if(num!=0)
...; </span> <br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1] = 1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Verdadeiro</td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Falso</td>
</tr>
</tbody></table>
<br />
</ol>
2- Qual o valor de x após a seguinte seqüência de comandos: <br />
<span style="font-family: Courier New,Courier;"> a
= 10;</span> <br />
<span style="font-family: Courier New,Courier;"> b =
20;</span> <br />
<span style="font-family: Courier New,Courier;"> x =
0;</span> <br />
<span style="font-family: Courier New,Courier;"> x =
(b > a) ? b : a;</span> <br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">0 </td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">2 </td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">10</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] =1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">20</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>e. </b></td>
<td valign="TOP">40</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>f.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
3- Qual o valor de x após a seqüência de comandos: <br />
<span style="font-family: Courier New,Courier;"> a
= 1;</span> <br />
<span style="font-family: Courier New,Courier;"> b =
2;</span> <br />
<span style="font-family: Courier New,Courier;"> c =
3;</span> <br />
<span style="font-family: Courier New,Courier;"> x =
0;</span> <br />
<span style="font-family: Courier New,Courier;"> x =
a < b ? a < c ? a : c : b < c ? b : c;</span> <br />
(DICA: antes de tentar resolver, coloque parênteses na expressão acima,
indicando a ordem de precedência dos operadores) <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">0 </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">1 </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">2 </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">3</td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
4- Os trechos de programa a seguir são equivalentes entre si, sob o ponto de vista do
que é impresso: <br />
<span style="font-family: Courier New,Courier;">
for (i = 0 ; i < 10; i++) printf("%d", i);</span> <br />
<span style="font-family: Courier New,Courier;"> e</span> <br />
<span style="font-family: Courier New,Courier;">
for (i = 0 ; i < 10; ++i) printf("%d", i);</span> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4] =1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
</ol>
5- O trecho de programa a seguir é <br />
<span style="font-family: Courier New,Courier;">
switch(num)</span> <br />
<span style="font-family: Courier New,Courier;"> {</span>
<br />
<span style="font-family: Courier New,Courier;">
case 1;</span> <br />
<span style="font-family: Courier New,Courier;">
printf("O numero e 1 ");</span> <br />
<span style="font-family: Courier New,Courier;">
break;</span> <br />
<span style="font-family: Courier New,Courier;">
case 2;</span> <br />
<span style="font-family: Courier New,Courier;">
printf("O numero e 2 ");</span> <br />
<span style="font-family: Courier New,Courier;">
break;</span> <br />
<span style="font-family: Courier New,Courier;">
default;</span> <br />
<span style="font-family: Courier New,Courier;">
printf("O numero e diferente de 1 e 2");</span> <br />
<span style="font-family: Courier New,Courier;">
break;</span> <br />
<span style="font-family: Courier New,Courier;"> }</span>
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Válido na linguagem C </td>
</tr>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Não válido na linguagem C </td>
</tr>
</tbody></table>
<br />
</ol>
6- Sendo <b>num</b> uma variável inteira, o que imprime o trecho de código a seguir? <br />
<span style="font-family: Courier New,Courier;">
num = 1;</span> <br />
<span style="font-family: Courier New,Courier;">
switch(num)</span> <br />
<span style="font-family: Courier New,Courier;"> {</span>
<br />
<span style="font-family: Courier New,Courier;">
case 1:</span> <br />
<span style="font-family: Courier New,Courier;">
printf("O numero e 1 ");</span> <br />
<span style="font-family: Courier New,Courier;">
case 2:</span> <br />
<span style="font-family: Courier New,Courier;">
printf("O numero e 2 ");</span> <br />
<span style="font-family: Courier New,Courier;">
default:</span> <br />
<span style="font-family: Courier New,Courier;">
printf("O numero e diferente de 1 e 2");</span> <br />
<span style="font-family: Courier New,Courier;"> }</span>
<br />
<br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">O numero e 1 </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">O numero e 2</td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">O numero e diferente de 1 e 2 </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">O numero e 1 O numero e 2 </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=1" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">O numero e 1 O numero e 2 O numero e diferente de 1 e 2</td>
</tr>
</tbody></table>
<br />
</ol>
7- Os dois blocos de código a seguir produzem o mesmo resultado: <br />
<span style="font-family: Courier New,Courier;">
for( i = 0 ; i < 3 ; i++)</span> <br />
<span style="font-family: Courier New,Courier;">
for ( j =0 ; j < 3; j++)</span> <br />
<span style="font-family: Courier New,Courier;">
printf("i+j = %d \n", i+j);</span> <br />
<span style="font-family: Courier New,Courier;">e</span> <br />
<span style="font-family: Courier New,Courier;">
for( i = 0 , j=0 ; i < 3 ; i++)</span> <br />
<span style="font-family: Courier New,Courier;">
for ( ; j < 3 ; j++)</span> <br />
<span style="font-family: Courier New,Courier;">
printf("i+j = %d \n", i+j);</span> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td valign="TOP"><b>a. </b></td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
</ol>
8- Qual a saída produzida pelo extrato de código a seguir: <br />
<span style="font-family: Courier New,Courier;">
int x;</span> <br />
<span style="font-family: Courier New,Courier;"> for
( x = 35 ; x > 0 ; x/=3)</span> <br />
<span style="font-family: Courier New,Courier;">
printf("%d " , x) ;</span> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8] =1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">35 11 3 1 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">11 3 1 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">11 3 1 0 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">35 11 3 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
9- Os extratos de código a seguir são equivalentes entre si: <br />
<span style="font-family: Courier New,Courier;">
int x = 10;</span> <br />
<span style="font-family: Courier New,Courier;">
while (--x > 9)</span> <br />
<span style="font-family: Courier New,Courier;">
{</span> <br />
<span style="font-family: Courier New,Courier;">
printf("%d", x);</span> <br />
<span style="font-family: Courier New,Courier;">
}</span> <br />
e <br />
<span style="font-family: Courier New,Courier;">
int x = 10;</span> <br />
<span style="font-family: Courier New,Courier;">
do {</span> <br />
<span style="font-family: Courier New,Courier;">
printf("%d", x);</span> <br />
<span style="font-family: Courier New,Courier;">
} while(--x > 9);</span> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
</ol>
10- Sendo i declarado e inicializado como: <br />
<span style="font-family: Courier New,Courier;">
int i = 0;</span> <br />
os seguintes extratos de código: <br />
<span style="font-family: Courier New,Courier;">
while (i = 5)</span> <br />
<span style="font-family: Courier New,Courier;"> {</span>
<br />
<span style="font-family: Courier New,Courier;">
printf("%d %d %d \n", i, i+2, i+4);</span> <br />
<span style="font-family: Courier New,Courier;">
i = 0;</span> <br />
<span style="font-family: Courier New,Courier;"> }</span>
<br />
e <br />
<span style="font-family: Courier New,Courier;">
if (i = 5) printf ("%d %d %d \n", i, i+2, i+4);</span> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">São idênticos sob o ponto de vista do que imprimem na tela</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Não imprimem nada na tela </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Têm sintaxe errada </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Um deles imprime 5, 7 e 9 uma única vez e o outro entra em loop,
imprimindo estes valores indefinidamente </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
11- A estrutura do switch abaixo é: <br />
<span style="font-family: Courier New,Courier;"> switch (t)</span> <br />
<span style="font-family: Courier New,Courier;"> {</span> <br />
<span style="font-family: Courier New,Courier;"> case
t < 10:</span> <br />
<span style="font-family: Courier New,Courier;">
printf("Hoje ta' fazendo muito frio");</span> <br />
<span style="font-family: Courier New,Courier;">
break;</span> <br />
<span style="font-family: Courier New,Courier;"> case
t < 25:</span> <br />
<span style="font-family: Courier New,Courier;">
printf("A temperatura está agradavel");</span> <br />
<span style="font-family: Courier New,Courier;">
break;</span> <br />
<span style="font-family: Courier New,Courier;">
default:</span> <br />
<span style="font-family: Courier New,Courier;">
printf("Hoje ta' quente pra chuchu");</span> <br />
<span style="font-family: Courier New,Courier;"> }</span> <br />
<span style="font-family: Courier New,Courier;"> </span> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Válida na linguagem C</td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Não válida na linguagem C </td>
</tr>
</tbody></table>
<br />
</ol>
12- O laço for a seguir <br />
<span style="font-family: Courier New,Courier;"> int i;</span> <br />
<span style="font-family: Courier New,Courier;"> for ( i = 0 ; i <= 5; i++ ,
printf("%d ", i));</span> <br />
<span style="font-family: Courier New,Courier;"> </span> <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Imprime 0 1 2 3 4 5 </td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Não funciona, pois tem sintaxe errada</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Imprime 1 2 3 4 5 6</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Imprime 1 2 3 4 5</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<a href="https://www.blogger.com/blogger.g?blogID=6926985245178197542" name="verifica"></a><br />
</ol>
<input onclick="check()" type="button" value="Verifica nota" /><input name="resetMe" onclick="zeroit()" type="reset" value="Limpa" /> <br />
Sua nota é: <input name="good" size="4" type="text" value="0" />em um máximo de
100. <br />
<br /></form>
<h2>
<span style="font-size: x-large;">Apostila de C - Solução dos exercícios sobre Testes e Laços da lista 3</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<h3>
Questão 1:</h3>
Vamos analisar a primeira expressão: if(num)<br />
A condição dela é simplesmente "num".<br />
Se num=0 o resultado do if é FALSO.<br />
Se num!=0 , o resultado do if é VERDADEIRO.<br />
<br />
Agora a próxima expressão: if(num!=0)<br />
Onde a condição do teste é "num!=0".<br />
Se num=0, o resultado do if é FALSO.<br />
Se num=!0, o resultado do if é VERDADEIRO.<br />
<br />
Gabarito:<b> a</b><br />
<b><br /></b>
<br />
<h3>
Questão 2:</h3>
A expressão de x é:<span style="font-family: inherit;"> <span style="background-color: white; line-height: 18px;">x = (b > a) ? b : a;</span><span style="background-color: white; line-height: 18px;"> </span><span style="background-color: white; line-height: 18px;"> </span></span><br />
<span style="font-family: inherit;"><span style="background-color: white; line-height: 18px;">Ou seja, vamos atribuir um valor para x de acordo com a condição de teste.</span></span><br />
<span style="font-family: inherit;"><span style="background-color: white; line-height: 18px;"><br /></span></span>
<span style="font-family: inherit;"><span style="background-color: white; line-height: 18px;">O teste do operador ternário é: b > a</span></span><br />
<span style="line-height: 17.98611068725586px;">Como a=10 e b=20, o teste resulta em VERDADEIRO, logo x vai assumir o primeiro valor:</span><br />
<span style="line-height: 17.98611068725586px;">x = b = 20</span><br />
<span style="line-height: 17.98611068725586px;"><br /></span>
<span style="line-height: 17.98611068725586px;">Gabarito: <b>d</b></span><br />
<span style="line-height: 17.98611068725586px;"><b><br /></b></span>
<br />
<h3>
<span style="line-height: 17.98611068725586px;">Questão 3:</span></h3>
<span style="line-height: 17.98611068725586px;">Temos a seguinte expressão: x = a < b ? a < c ? a : c : b < c ? b : c; </span><br />
<span style="line-height: 17.98611068725586px;"><br /></span>
<span style="line-height: 17.98611068725586px;">Sabemos que o operador ternário é da seguinte forma:</span><br />
<span style="line-height: 17.98611068725586px;">teste condicional ? (opção 1, se o teste é TRUE) : (opção 2, se o teste é FALSE)</span><br />
<span style="line-height: 17.98611068725586px;"><br /></span>
<span style="line-height: 17.98611068725586px;">Vamos deixar a expressão de "x" igual a esta acima:</span><br />
<span style="line-height: 17.98611068725586px;">x = (a < b) ? (a < c ? a ) : ( c : b < c ? b : c ); </span><br />
<span style="line-height: 17.98611068725586px;"><br /></span>
<span style="line-height: 17.98611068725586px;">Assim, nosso teste condicional é: a< b, que retorna TRUE</span><br />
<span style="line-height: 17.98611068725586px;">Logo, x = (a < c ? a) ; </span><br />
<span style="line-height: 17.98611068725586px;"><br /></span>
<span style="line-height: 17.98611068725586px;">Ou seja, agora temos o teste: a < c</span><br />
<span style="line-height: 17.98611068725586px;">Que se for verdade, retorna "a". Se for falso, não retorna nada.</span><br />
<span style="line-height: 17.98611068725586px;">Como o teste é verdadeiro, x = a = 1</span><br />
<span style="line-height: 17.98611068725586px;"><br /></span>
<span style="line-height: 17.98611068725586px;">Gabarito: <b>b</b></span><br />
<br />
<h3>
<span style="line-height: 17.98611068725586px;">Questão 4:</span></h3>
<span style="line-height: 17.98611068725586px;">Ambos exibem uma contagem de 0 até 9.</span><br />
<span style="line-height: 17.98611068725586px;"><br /></span>
<span style="line-height: 17.98611068725586px;">Gabarito: <b>a</b></span><br />
<span style="line-height: 17.98611068725586px;"><b><br /></b></span>
<br />
<h3>
<span style="line-height: 17.98611068725586px;">Questão 5:</span></h3>
<span style="line-height: 17.98611068725586px;">O seguinte trecho de código:</span><br />
<span style="font-family: inherit;"><span style="background-color: white; line-height: 18px;">printf("O numero e diferente de 1 e 2");</span><span style="background-color: white; line-height: 18px;"> </span><br style="background-color: white; line-height: 18px;" /><span style="background-color: white; line-height: 18px;"> break;</span><span style="background-color: white; line-height: 18px;"> </span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Deve pertencer a algum "case" ou ao "default", mas ele não faz parte de nenhum deles, são linhas 'soltas', não fazem sentido elas não pertencerem a nenhum elemento do <b>switch</b>.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Gabarito: <b>b</b></span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><b><br /></b></span></span>
<br />
<h3>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Questão 6:</span></span></h3>
<br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Quando colocamos um número dentro do <b>switch</b> ele vai procurar dentro dos <i>cases</i> existentes aquele número. Caso ele encontre, ele vai rodar o código a partir daquele case em diante, até encontrar um comando <i>break</i>, que dá a ordem de parar.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">E caso não existe esse <i>break</i>, o que ocorre?</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Ele vai continuar rodando tudo até o final.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">No caso dessa questão da apostila, o "num" vale 1, e de cara o primeiro case é 1.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Então vai rodar tudo a partir dali. Ou seja, vai rodar o case 1, case 2 e o default.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Gabarito: <b>e</b></span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><b><br /></b></span></span>
<br />
<h3>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Questão 7:</span></span></h3>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Esse tipo de exercício é interessante que se faça sem testar o código, apenas olhando e raciocinando.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Vamos lá, a diferença neste código está na inicialização da variável j.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">No primeiro caso, quantas vezes ela é colocada com igual a 0?</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">A resposta é 3 vezes: quando i=0, quando i=1 e quando i=2</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Ou seja, sempre que o laço for de cima inicia uma iteração, o for debaixo inicia com o valor j=0</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Já no segundo caso não. A variável "j" recebe o valor 0 apenas no início de tudo.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">No início, temos i=j=0, e depois o valor de j vai subindo: j=1, j=2 e j=3</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Depois é a vez de i=1, porém, o j vai continuar tendo valor 3, e não retorna a ser 0, como no primeiro caso.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Gabarito: <b>b</b></span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><b><br /></b></span></span>
<br />
<h3>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Questão 8:</span></span></h3>
<br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Inicialmente, x=35 ( e x>0), então ele é impresso: 35</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Em seguida: x = x/3 = 11 (x é inteiro)</span></span><br />
<span style="background-color: white; font-family: inherit; line-height: 18px;">Como x>0, então ele é impresso: 11</span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Em seguida: x = x/3 = 3</span></span><br />
<span style="background-color: white; font-family: inherit; line-height: 18px;">Como x>0, então ele é impresso: 3</span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Em seguida: x = x/3 = 1</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Como x>0, ele é impresso: 1</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Por fim: x = x/3 = 0</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Como x<=0, ele não é mais impresso.</span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Gabarito: <b>a</b></span></span><br />
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;"><b><br /></b></span></span>
<br />
<h3>
<span style="background-color: white; line-height: 18px;"><span style="font-family: inherit;">Questão 9:</span></span></h3>
<br />
Para resolver esta questão da apostila de C, precisamos saber o que significa: --x<br />
Que nada mais é que uma operação de decremento de x. Ou seja, a primeira coisa que ocorre é um decremento de uma unidade (x = x-1).<br />
<br />
Assim, no primeiro caso temos x=10 inicialmente.<br />
Dentro do laço while vemos: --x<br />
Logo, x é decrementado e agora x=9 e a seguinte condição é falsa: x > 9<br />
Daí não ocorre nenhuma impressão na tela<br />
(Se fosse x-- > 9, primeiro haveria o testo com x=10, e só depois do teste ocorreria o decremento).<br />
<br />
No segundo caso temos um laço DO WHILE, ou seja, a primeira iteração SEMPRE OCORRE.<br />
Então é impresso o valor de x, e só depois ocorre o laço while, igual ao exemplo passado.<br />
<br />
Como no primeiro caso nada é impresso, e no segundo caso é, os dois códigos em C não são iguais.<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
<br />
<h3>
Questão 10:</h3>
Nesta questão da apostila há uma pegadinha.<br />
O seguinte código retorna sempre verdadeiro: i=5<br />
Sim, não importa o valor de "i", esse comando vai sempre ser verdadeiro pois se trata de uma ATRIBUIÇÃO. Se fosse i==5 (que é uma COMPARAÇÃO), retornaria falso.<br />
Logo, o primeiro código é sempre verdadeiro e há um loop infinito.<br />
<br />
O mesmo ocorre no segundo caso, o if vai retornar TRUE, pois é uma atribuição e o código do IF vai ser rodado, porém só uma vez (pois IF é um teste condicional e não um laço/loop).<br />
<br />
Gabarito: <b>d</b><br />
<b><br /></b>
<br />
<h3>
Questão 11:</h3>
O comando switch tem uma limitação: seus <i>case</i> devem conter valor, e nada mais.<br />
Nada de teste, atribuição ou uma operação qualquer.<br />
Ele deve conter números, valores.<br />
<br />
No caso, os <i>cases</i> possuem testes, invalidando o código.<br />
<br />
Gabarito: <b>b</b><br />
<b><br /></b>
Questão 12:<br />
Inicialmente temos i=0, e o teste para saber se i<=5<br />
Sempre que for verdadeiro, é executado o código do for, que não faz absolutamente nada.<br />
<br />
Após o "nada" ser feito, é realizada a operação pós-teste do laço for, que é o incremento e a impressão do valor de i.<br />
<br />
Ou seja, o que esse código faz é: incrementa i, depois imprime.<br />
Ele faz isso desde i=0 até i=5<br />
Como i=0, o primeiro valor impresso é 1 (por antes o "i" é incrementado).<br />
O valor de "i" vai crescendo até atingir 5, nesse ponto é incrementado e impresso 6.<br />
Como i=6, a condição "i<=5" é falsa e termina o laço for, que exibe os números de 1 até 6.<br />
<br />
Gabarito: <b>c</b>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-42041843516028072732014-01-14T18:05:00.000-08:002014-01-15T07:29:05.663-08:00Apostila de C - Variáveis, Operadores, Operações Matemáticas e Lógicas (Lista 2)Neste tutorial, iremos resolver a Lista 2 da Apostila de C da UFMG.<br />
Mostraremos as questões e comentaremos cada um dos exercícios.<br />
<a name='more'></a><br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obtenha seu certificado de Programador C e entre no Mercado de Trabalho</a><br />
<br />
<h2>
<span style="font-size: x-large;">Sobre a Apostila de C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Este tutorial se destina a resolver a famosa e muitíssimo utilizada Apostila do Curso de C da Universidade Federal de Minas Gerais, que há quase 20 anos vem ajudando a educar uma legião de programadores C no Brasil.<br />
<br />
É um material de excelente qualidade que é ofertado de maneira totalmente gratuita, que era um curso da UFMG que já foi encerrado, mas devido a utilidade do projeto, a apostila ainda continua no ar.<br />
<br />
Para saber mais sobre acesse:<br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Completa-Download-Resolvida-Codigos-Comentados-UFMG.html" target="_blank">Apostila de C</a><br />
<br />
Nosso objetivo, além de divulgar e mostrar essa apostila para os iniciantes na linguagem C, é resolver e comentar as questões propostas na <b>Lista 2 da Apostila de C</b>.<br />
<br />
As seguintes questões dessa apostila abordam assuntos que podem ser encontrados em nossos tutoriais do C Progressivo, como:<br />
<a href="http://www.cprogressivo.net/2012/12/O-tipo-inteiroint-na-linguagem-C.html" target="_blank">Números inteiros</a> (<a href="http://www.cprogressivo.net/2013/01/Modificadores-do-tipo-inteiro-int-em-C--short-long-signed-unsigned.html" target="_blank">Modificadores do tipo int</a>)<br />
<a href="http://www.cprogressivo.net/2012/12/Os-tipos-float-e-double-numeros-decimais-reais-em-C.html" target="_blank">Números decimais - Float e Double</a><br />
<a href="http://www.cprogressivo.net/2012/12/O-tipo-char-como-escrever-textos-na-linguagem-C.html" target="_blank">Caracteres - O tipo char</a><br />
<a href="http://www.cprogressivo.net/2013/03/Atalhos-matematicos-em-linguagem-C.html" target="_blank">Operadores Matemáticos</a><br />
<a href="http://www.cprogressivo.net/2012/12/Operacoes-matematicas-em-C--Soma-subtracao-multiplicacao-divisao-e-modulo-ou-resto-da-divisao-e-precedencia-dos-operadores.html" target="_blank">Operações Matemáticas e Precedência de Operadores</a><br />
<a href="http://www.cprogressivo.net/2013/01/Sistema-binario-e-Valores-Logicos-true-ou-false.html" target="_blank">Lógica Binária</a><br />
<a href="http://www.cprogressivo.net/2013/01/Operadores-logicos-E-OU-e-negacao.html" target="_blank">Operadores Lógicos</a><br />
<a href="http://www.cprogressivo.net/2013/02/Operadores-incremento-e-decremento.html" target="_blank">Operadores de Incremento ++ e Decremento --</a><br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Questões da Lista 2 da Apostila de C</span></h2>
<script>
<!-- hide script from obsolete browsers
function makeArray(length)
{
for (var i=0; i < length; i++)
{
this[i] = 0;
}
this.length = length;
}
var NumQuestions = 12; // Change this value for each test var
ArraySize = NumQuestions + 1;
// Add an extra array element so that we don't have to use index 0. That way
// each question number is its own index into the array.
var questions = new makeArray(ArraySize);
function zeroit()
{
for (var i=0; i < ArraySize; i++)
{
questions[i] = 0;
}
}
function check()
{
var NumCorrect = 0;
var score = 0;
for (var i=1; i < ArraySize; i++)
{
NumCorrect += questions[i];
}
score = 100 * NumCorrect/NumQuestions;
document.question.good.value = score;
}
// end hiding contents -->
</script>
<br />
<hr />
<form name="question">
<br />
<br />
1- Escolha a opção que inclui somente nomes válidos para variáveis na linguagem C. <br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1] = 1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">If, a_b_2, H789, _yes </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">i, j, int, obs</td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">9xy, a36, x*y, --j</td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">2_ou_1, \fim, *h, j </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
2- Qual das instruções abaixo está errada? <br />
<ol type="1">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">int i; </td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">long float x; </td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">long double y;</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">long ijk; </td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>e. </b></td>
<td valign="TOP">short int a;</td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP"><b>f.</b> </td>
<td valign="TOP">unsigned b; </td>
</tr>
</tbody></table>
<br />
</ol>
3- Em um compilador para um hardware de 16 bits uma variável double ocupa o mesmo
espaço que _____ variáveis do tipo char <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Uma </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Duas </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Quatro </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Oito </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Dezesseis </td>
</tr>
</tbody></table>
<br />
</ol>
4- Qual o trecho de programa que inicializa a variável z? <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">float z , z1=10.; </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">float z; z = 10; </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=1" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">float z = 10;</td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">z = 10; </td>
</tr>
</tbody></table>
<br />
</ol>
5- O trecho de programa a seguir é <br />
<span style="font-family: Courier New,Courier;">
</span><span style="font-family: Courier New,Courier; font-size: small;">main()</span><big><br />
</big><span style="font-family: Courier New,Courier; font-size: small;"> {</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
char condicao;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
condicao = 'D';</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
int i = 1;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: medium;"> }</span><big><br />
</big><br />
<ol start="4">
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Válido na linguagem C </td>
</tr>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Não válido na linguagem C </td>
</tr>
</tbody></table>
<br />
</ol>
6- 0101 é uma constante __________ na linguagem C. <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6] =0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Binária </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Hexadecimal</td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Inteira </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Octal </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Ponto Flutuante </td>
</tr>
</tbody></table>
<br />
</ol>
7- Em C, "t" e 't' representam a mesma constante. <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td valign="TOP"><b>a. </b></td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
</ol>
8- Diga o resultado das variáveis x, y e z depois da seguinte sequência de
operações: <br />
<span style="font-family: Courier New,Courier; font-size: small;">
int x,y,z;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
x=y=10;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
z=++x;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
x=-x;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
y++;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
x=x+y-(z--);</span><br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">x = 11, y = 11, z = 11 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=1" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">x = -11, y = 11, z = 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">x = -10, y = 11, z = 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">x = -10, y = 10, z = 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
9- Diga o resultado das variáveis x, y e z depois da seguinte sequência de
operações: <br />
<span style="font-family: Courier New,Courier; font-size: small;">
int x,y;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
int a = 14, b = 3;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
float z;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
x = a/b;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
y = a%b;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;">
z = y/x;</span><br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">x = 4.66666, y = 2, z = 0.4286 </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">x = 5, y =2, z= 0.4 </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">x = 5, y = 2, z = 0. </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">x = 4, y = 2, z = 0.5 </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=1" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">x = 4, y =2, z = 0. </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP"><b>f.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
10- A operação lógica <span style="font-family: Courier New,Courier;">(-5 ||
0)&&(3 >= 2)&&(1 != 0)||(3 < 0)</span> é: <br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10] = 1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">Verdadeira</td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">Falsa </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">Inválida, pois sua sintaxe está errada. </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">Nem Verdadeira nem Falsa </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
11- Quais os valores de a, b e c após a execução do código abaixo? <br />
<span style="font-family: Courier New,Courier; font-size: small;"> int a = 10, b = 20,
c;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;"> c =
a+++b;</span><br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11] =1" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">a = 11, b = 20, c =30</td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">a = 10 , b = 21, c = 31 </td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">a = 11, b = 20, c = 31</td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">a = 10, b = 21, c = 30 </td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores </td>
</tr>
</tbody></table>
<br />
</ol>
12- Qual o valor das variáveis v, x, y e z após a execução do seguinte trecho de
código <br />
<span style="font-family: Courier New,Courier; font-size: small;"> int v = 0, x = 1, y = 2, z = 3;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;"> v += x+y;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;"> x *= y = z + 1;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;"> z %= v + v + v;</span><big><big><big><br />
</big></big></big><span style="font-family: Courier New,Courier; font-size: small;"> v += x += y += 2;</span><br />
<ol start="4">
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12] = 0" type="radio" /></td>
<td valign="TOP"><b>a.</b> </td>
<td valign="TOP">v=11, x=8, y=6, z=3 </td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>b.</b> </td>
<td valign="TOP">v=0, x=1, y=2, z=3 </td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>c.</b> </td>
<td valign="TOP">v=10, x=7, y=6, z=3</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=1" type="radio" /></td>
<td valign="TOP"><b>d.</b> </td>
<td valign="TOP">v=13, x=10, y=6, z=3</td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP"><b>e.</b> </td>
<td valign="TOP">Nenhuma das opções anteriores</td>
</tr>
</tbody></table>
<a href="http://www.blogger.com/blogger.g?blogID=6926985245178197542" name="verifica"></a><br />
</ol>
<input onclick="check()" type="button" value="Verifica nota" /><input name="resetMe" onclick="zeroit()" type="reset" value="Limpa" /> <br />
Sua nota é: <input name="good" size="4" type="text" value="0" />em um máximo de
100. <br />
<br /></form>
<br />
<h2>
<span style="font-size: x-large;">Resolução da Lista 2 da Apostila de C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<h3>
Questão 1:</h3>
Uma variável, em C, deve ter seu nome composto por caracteres alfanumérico (número ou letra, maiúscula ou minúscula) ou pelo underline _<br />
<br />
Não podemos dar um nome reservado (como for, while ou if) a uma variável também. Mas devemos lembrar que o C é case sensitive, então não pode 'if', mas pode 'If'.<br />
<br />
Também não podemos iniciar o nome de uma variável por um dígito!<br />
<br />
Gabarito <b>A</b><br />
<b><br /></b>
<br />
<h3>
Questão 2:</h3>
Os tipos em C são: char, unsigned char, signed char, int unsigned int, signed int, short in, unsigned short int, signed short int, long int, signed long int, unsigned long int, float, double e long double.<br />
<br />
Ou seja, não existe long float.<br />
<br />
Gabarito <b>B</b><br />
<b><br /></b>
<br />
<h3>
Questão 3:</h3>
Em um computador com hardware de 16 bits, um double ocupa 8 bytes e o char ocupa apenas 1 byte.<br />
Então 8/1=8<br />
<br />
Gabarito <b>D</b><br />
<b><br /></b>
<br />
<h3>
Questão 4:</h3>
Entendemos por inicializar uma variável o ato de criar (reservar) uma variável com um valor inicial, escolhido por nós.<br />
<br />
No item <b>A</b> dessa questão da apostila, a variável z é criada e é dado o valor de '10' para outra variável, a z1. No item <b>B</b>, a variável z é criada sem ser inicializada (então um valor do 'lixo', local aleatório da memória, que inicia a variável), só depois que o valor 10 é atribuído.<br />
Já no item <b>D</b> a variável não é declarada, então não é atribuído o valor 10 na definição da variável, não configurando uma inicialização.<br />
<br />
Gabarito <b>C</b><br />
<b><br /></b>
<br />
<h3>
Questão 5:</h3>
A função <b>main</b> retorna uma variável do tipo inteira, então devemos usar o <b>int main() { ... }</b><br />
Como ela retorna um inteiro, é aconselhável, ao final da função, usar o "return 0;".<br />
<br />
Gabarito <b>B</b><br />
<b><br /></b>
<br />
<h3>
Questão 6:</h3>
Conforme a lição sobre <i>Constantes</i>, da Aula 3 da própria Apostila de C da UFMG, números iniciados em 0 se referem as constantes e números <b>octais</b>.<br />
<br />
Gabarito <b>D</b><br />
<b><br /></b>
<br />
<h3>
Questão 7:</h3>
Quando usamos aspas duplas, como em "t", estamos nos referindo a uma string.<br />
Ou seja, para armazenar "t" necessitaríamos no mínimo de duas variáveis do tipo <i>char</i> em um vetor: uma para para armazenar o caractere 't' e outra para armazenar o caractere delimitador de string '\0'.<br />
<br />
Já a 't' é um simples caractere ASCII.<br />
Ou seja, são duas coisas totalmente diferentes do ponto de vista da linguagem C.<br />
<br />
Gabarito <b>B</b><br />
<b><br /></b>
<br />
<h3>
Questão 8:</h3>
x=y=10 -> Tanto x como y recebem o valor 10<br />
z=++x -> Como o operador '++' vem antes, primeiro x é incrementado (passa a ser 11) e só depois é atribuído a z (que será igual a 11)<br />
x=-x -> 'x' recebe seu valor oposto, agora é -11<br />
y++ ->: O valor de 'y' é incrementado e agora vale 11<br />
x=x+y-(z--) -> Como o 'z' vem antes do operador de decremento '--', primeiro fazemos a operação normalmente, sem esse oprador (x = x+y - z), que resulta em x=-11 . Agora sim fazemos o decremento, então z=10<br />
<br />
Gabarito <b>B</b><br />
<b><br /></b>
<br />
<h3>
Questão 9:</h3>
Para resolver este exercício da apostila de C, devemos levar em consideração que 'a', 'b', 'x' e 'y' são números inteiros, então devemos lembrar que o resultado inteiro de uma divisão de dois números inteiros é a parte inteira do resultado.<br />
<br />
Por exemplo: x=a/b=14/3 = 4<br />
(se você fizer isso na calculadora vai obter 4.667, mas como 'x' é inteiro, vamos ficar apenas com a parte inteira do resultado, que é 4)<br />
<br />
Já y=a%b= 2 (resto da divisão)<br />
E o resultado inteiro de: y/x = 2/4 = 0<br />
<br />
Gabarito <b>E</b><br />
<b><br /></b>
<br />
<h3>
Questão 10:</h3>
Vamos fazer como o Jack, o estripador: por partes.<br />
<br />
(-5 || 0) -> É uma operação que não faz alguma comparação ou teste, cujo resultado é verdadeiro (TRUE)<br />
(3 >=2) -> Verdadeiro, retorna TRUE<br />
(1 != 0) -> TRUE também<br />
( 3 < 0) -> FALSE<br />
<br />
Vamos chamar TRUE de 1 e FALSE de 0. Montando a expressão:<br />
1 && 1 && 1 || 0<br />
É até fácil ver que o resultado é TRUE. Mas podemos reduzir o trecho:<br />
1 && 1 && 1 para simplesmente 1. Obtendo: 1 || 0 , que retorna verdadeiro ou TRUE.<br />
<br />
Gabarito <b>A</b><br />
<b><br /></b>
<br />
<h3>
Questão 11:</h3>
Para resolver esta penúltima questão dessa Lista 2 da Apostila, também temos que ir com calma e dividir por partes.<br />
<br />
Assim, temos: c = a+++b<br />
Isto está dessa maneira de propósito, para confundir.<br />
Reescrevendo de outra maneira, essa expressão equivale a: c = a++ + b<br />
Ou de maneira mais simples: c = (a++) + b<br />
<br />
Assim, temos 'a++', isso quer dizer que primeiro vamos trabalhar com o valor de 'a' normalmente, e só ao término da operação é que o operador de incremento entra em ação.<br />
Logo, a primeira parte da instrução é simplesmente: c = a + b =30<br />
<br />
Agora sim, incrementamos a: a++ = 11<br />
<br />
Gabarito <b>A</b><br />
<b><br /></b>
<br />
<h3>
Questão 12:</h3>
Primeira instrução: v += x + y<br />
Isso equivale a : v = (v + x + y) = 0 + 1 + 2 = 3<br />
<br />
Na segunda instrução, temos duas operações na mesma linha: x *= y = z + 1;<br />
Nesses casos, fazemos sempre da direita para a esquerda.<br />
Assim, a primeira operação: y = z + 1 = 4<br />
Agora: x*=y -> x = x*y = 1*4 = 4<br />
<br />
Agora: z %= v + v + v<br />
Que é o mesmo que: z = z%(v+v+v) = 3%(3+3+3) = 3 % 9 = 3<br />
<br />
E por fim temos três operações numa linha só: v += x += y += 2<br />
Vamos, mais uma vez, fazer da direita para a esquerda.<br />
Primeiro: y+=2 -> y=y+2 = 4+2=6<br />
Segundo: x+=y -> x=x+y = 4 + 6 =10<br />
Por fim: v+=x -> v=v+x = 3 + 10=13<br />
<br />
Gabarito <b>D</b>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-50453036326155357932014-01-12T14:48:00.003-08:002014-01-12T17:25:26.619-08:00Apostila de C - Conceitos Básicos sobre a Linguagem C (Lista 1)Neste tutorial de nosso curso, iremos mostrar os exercícios da Lista 1 da Apostila de C da UFMG, que trata os conceitos Básicos sobre programação em C.<br />
<br />
<a name='more'></a><br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obter o certificado do Curso de Programação em C</a><br />
<br />
<h2>
<span style="font-size: x-large;">Apostila de C da UFMG - Exercícios resolvidos e códigos comentados</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Neste artigo iremos mostrar os exercícios da Lista 1 da Apostila de C da UFMG, e em seguida iremos resolvê-la, comentando todas as questões e códigos.<br />
<br />
Este material é ofertado gratuitamente na internet, e os autores autorizaram o uso de seu material.<br />
Para saber mais sobre como baixar a apostila e sobre este projeto, veja nosso artigo:<br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Completa-Download-Resolvida-Codigos-Comentados-UFMG.html" target="_blank">Apostila de C</a><br />
<br />
Para resolver estes exercícios, você deve ter estudado nossa seção sobre conceitos básicos de C:<br />
<a href="http://www.cprogressivo.net/p/o-basico-da-linguagem-c.html" target="_blank">Conceitos Básicos de C</a><br />
<br />
<br />
Alguns assuntos que serão usados nos exercícios:<br />
<a href="http://www.cprogressivo.net/2012/11/A-funcao-printf-Caracteres-Especais.html" target="_blank">Saídas simples através da função printf</a><br />
<a href="http://www.cprogressivo.net/2012/12/Recebendo-letras-do-usuario--As-funcoes-scanf-getchar-getc-e-fgetc.html" target="_blank">Como receber dados do usuário através da função scanf</a><br />
<a href="http://www.cprogressivo.net/2013/02/O-que-e-para-que-serve-e-como-usar-o-laco-FOR-em-C.html" target="_blank">Laço for</a><br />
<a href="http://www.cprogressivo.net/2013/02/O-que-e-para-que-serve-e-como-usar-e-declarar-funcao-em-C.html" target="_blank">O que são funções</a><br />
<a href="http://www.cprogressivo.net/2013/03/O-que-sao-STRINGS-como-declarar-inicializar-e-o-caractere-delimitador-0.html" target="_blank">Strings em C</a><br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Lista 1 - Questões sobre conceitos Básicos da Linguagem C</span></h2>
<br />
<script>
<!-- hide script from obsolete browsers
function makeArray(length)
{
for (var i=0; i < length; i++)
{
this[i] = 0;
}
this.length = length;
}
var NumQuestions = 12; // Change this value for each test var
ArraySize = NumQuestions + 1;
// Add an extra array element so that we don't have to use index 0. That way
// each question number is its own index into the array.
var questions = new makeArray(ArraySize);
function zeroit()
{
for (var i=0; i < ArraySize; i++)
{
questions[i] = 0;
}
}
function check()
{
var NumCorrect = 0;
var score = 0;
for (var i=1; i < ArraySize; i++)
{
NumCorrect += questions[i];
}
score = 100 * NumCorrect/NumQuestions;
document.question.good.value = score;
}
// end hiding contents -->
</script>
<br />
<form name="question">
<br />
<ol type="1">
<li>A linguagem C tem este nome porque foi a sucessora da linguagem B.</li>
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1] = 1" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a1" onclick="questions[1]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<li>Em C, variáveis com nomes abc e Abc representam a mesma variável .</li>
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2] = 0" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a2" onclick="questions[2]=1" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<li>O programa</li>
</ol>
<ol start="4">
<ol type="1">
<span style="font-family: Courier New,Courier;">#include <stdio.h></span> <br />
<span style="font-family: Courier New,Courier;">main()</span> <br />
<span style="font-family: Courier New,Courier;">{</span> <br />
<span style="font-family: Courier New,Courier;"> int x;</span> <br />
<span style="font-family: Courier New,Courier;">
scanf("%d",&x);</span> <br />
<span style="font-family: Courier New,Courier;"> printf("%d",x);</span>
<br />
<span style="font-family: Courier New,Courier;">}</span> <br />
</ol>
Lê uma variável pelo teclado e a imprime na tela <br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3] = 1" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a3" onclick="questions[3]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
<li>A instrução <span style="font-family: Courier New,Courier;">#include <stdio.h></span>
no programa anterior é colocada para que possamos utilizar as funções <b>scanf e</b> <b>printf</b></li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4] = 1" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a4" onclick="questions[4]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
<li>Os comentários na linguagem C só podem ter uma linha de comprimento</li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5] = 0" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a5" onclick="questions[5]=1" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
<li>Uma string, é uma seqüência de caracteres terminada com um '\0'. Uma string pode ser
armazenada em um vetor de caracteres</li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6] = 1" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a6" onclick="questions[6]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
<li>Sendo i uma variável inteira, a seguinte chamada a scanf é válida: <span style="font-family: Courier New,Courier;"> scanf("%d", i);</span></li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7] = 0" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Verdadeiro </td>
</tr>
<tr>
<td valign="TOP"><input name="a7" onclick="questions[7]=1" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Falso </td>
</tr>
</tbody></table>
<br />
<li>O que faz o seguinte programa em C?</li>
<br />
<ol type="1">
<span style="font-family: Courier New,Courier;">#include <stdio.h></span> <br />
<span style="font-family: Courier New,Courier;">main()</span> <br />
<span style="font-family: Courier New,Courier;">{</span> <br />
<span style="font-family: Courier New,Courier;"> int i =2;</span> <br />
<span style="font-family: Courier New,Courier;"> printf ("\n O valor de
i = %d ", i);</span> <br />
<span style="font-family: Courier New,Courier;">}</span></ol>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8] = 0" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Nada </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Imprime: O valor de i = 2 </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=0" type="radio" /></td>
<td valign="TOP">c. </td>
<td valign="TOP">Imprime: \n O valor de i = %d </td>
</tr>
<tr>
<td valign="TOP"><input name="a8" onclick="questions[8]=1" type="radio" /></td>
<td valign="TOP">d. </td>
<td valign="TOP">Pula para a próxima linha e imprime: O valor de i = 2 </td>
</tr>
</tbody></table>
<br />
<li>O que é uma função em C?</li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9] = 0" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Parte de um programa </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Um bloco de código que pode ser utilizado diversas vezes na execução
de um programa </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP">c. </td>
<td valign="TOP">Uma estrutura da linguagem C que pode ser utilizada para que um programa
fique mais organizado </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=0" type="radio" /></td>
<td valign="TOP">d. </td>
<td valign="TOP">Um bloco de código que pode receber parâmetros, processá-los e
retornar alguma coisa </td>
</tr>
<tr>
<td valign="TOP"><input name="a9" onclick="questions[9]=1" type="radio" /></td>
<td valign="TOP">e. </td>
<td valign="TOP">Todas opções acima </td>
</tr>
</tbody></table>
<br />
<li>O comando printf ("%s%d%%","Juros de ",10); imprime:</li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10] = 1" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Juros de 10% </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">%s%d%% Juros de 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP">c. </td>
<td valign="TOP">% Juros de 10 </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP">d. </td>
<td valign="TOP">10 Juros de </td>
</tr>
<tr>
<td valign="TOP"><input name="a10" onclick="questions[10]=0" type="radio" /></td>
<td valign="TOP">e. </td>
<td valign="TOP">Nenhuma das anteriores </td>
</tr>
</tbody></table>
<br />
<li>O laço for de uma única instrucao termina com:</li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11] = 0" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Virgula </td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">Chave de abertura </td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=0" type="radio" /></td>
<td valign="TOP">c. </td>
<td valign="TOP">Chave de fechamento </td>
</tr>
<tr>
<td valign="TOP"><input name="a11" onclick="questions[11]=1" type="radio" /></td>
<td valign="TOP">d. </td>
<td valign="TOP">Ponto e virgula </td>
</tr>
</tbody></table>
<br />
<li>A expressão de inicialização de um laco for</li>
<br />
<table border="0" cellpadding="2" class="Answer">
<tbody>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12] = 0" type="radio" /></td>
<td valign="TOP">a. </td>
<td valign="TOP">Nunca é executada; </td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP">b. </td>
<td valign="TOP">É executada uma única vez a cada iteração </td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=0" type="radio" /></td>
<td valign="TOP">c. </td>
<td valign="TOP">É executada enquanto o laço não termina </td>
</tr>
<tr>
<td valign="TOP"><input name="a12" onclick="questions[12]=1" type="radio" /></td>
<td valign="TOP">d. </td>
<td valign="TOP">É executada uma vez antes do laço ser iniciado </td>
</tr>
</tbody></table>
<a href="https://www.blogger.com/blogger.g?blogID=6926985245178197542" name="verifica"></a><br />
</ol>
<input onclick="check()" type="button" value="Verifica nota" /><input name="resetMe" onclick="zeroit()" type="reset" value="Limpa" /> <br />
Sua nota é: <input name="good" size="4" type="text" value="0" />em um máximo de
100. </form>
<br />
<h2>
<span style="font-size: x-large;">Solução da Lista 1 da Apostila de C
</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<h3>
Questão 1:</h3>
Sim, existiu uma linguagem chamada <a href="http://pt.wikipedia.org/wiki/B_(linguagem_de_programa%C3%A7%C3%A3o)" rel="nofollow" target="_blank">B</a>.<br />
Essa linguagem B tinha esse nome porque era uma versão simplificada de outra linguagem, a BCPL.<br />
Dennis Ritchie, criador da linguagem C, se influenciou bastante na B para criá-la.<br />
<br />
Gabarito <b>A</b><br />
<br />
<h3>
Questão 2:</h3>
A linguagem C é <i>case sensitive</i>, ou seja, há diferença entre maiúsculo e minúsculo.<br />
Ou seja, uma variável nomeada de "c" é totalmente diferente de de nome "C", portanto "abc" é diferente de "Abc".<br />
<br />
Gabarito <b>B</b><br />
<b><br /></b>
<br />
<h3>
Questão 3:</h3>
O simples programa usa a função <b>scanf</b> para ler um inteiro do teclado do usuário e armazena na variável x. Em seguida, usa-se a função <b>printf</b> para exibir esta variável inteira.<br />
<br />
Gabarito <b>A</b><br />
<b><br /></b>
<br />
<h3>
Questão 4:</h3>
Adicionamos as bibliotecas no início de nossos programas em C para que possamos utilizar alguns recursos destes, como funções e constantes.<br />
A biblioteca <b>stdio</b> é a responsável pelas entradas e saídas (<i>io</i>, <i>in</i> e <i>out</i>) padrões (<i>std</i>, de <i>standard</i>), que são o teclado e a tela.<br />
<br />
Gabarito <b>A</b>.<br />
<br />
<h3>
Questão 5:</h3>
Podemos usar o comando <i style="font-weight: bold;">//</i> para criar rapidamente uma linha de comentário.<br />
Ou podemos usar o <i style="font-weight: bold;">/*</i> e <i style="font-weight: bold;">*/</i> para comentar uma ou mais linhas de um código em C.<br />
<br />
Gabarito <b>B</b><br />
<b><br /></b>
<br />
<h3>
Questão 6:</h3>
De fato, uma string é um vetor de caracteres, e o símbolo <b>\0</b> é usado para sinalizar o final da string, e só podemos armazenar uma string (um texto), em um vetor de <i>char</i>s.<br />
<br />
Gabarito <b>A</b><br />
<b><br /></b>
<br />
<h3>
Questão 7:</h3>
Quando usamos a função <b>scanf</b>, ela necessita de um endereço de memória.<br />
No caso, ela precisa do endereço de memória da variável <b>i</b>, que é <b>&i</b>, e não da variável <b>i</b>.<br />
<br />
Gabarito <b>B</b><br />
<b><br /></b>
<br />
<h3>
Questão 8:</h3>
É fácil errar ou se confundir nessa, pois tem uma pegadinha.<br />
Note que a primeira coisa que existe no <b>printf</b> é o caractere de <i>new line</i>, o <b>\n</b>.<br />
Então a primeira coisa que aparece na tela como resultado do programa, é uma quebra de linha.<br />
<br />
Gabarito <b>D</b><br />
<b><br /></b>
<br />
<h3>
Questão 9:</h3>
Uma função é um trecho de código que serve para ser usado (chamado, invocado) várias vezes no decorrer da execução de um programa, sem ser preciso ficar repetindo o mesmo trecho de código.<br />
Obviamente isso reduz e organiza o tamanho de um programa.<br />
<br />
Uma importante funcionalidade das <a href="http://www.cprogressivo.net/p/funcao-em-linguagem-de-programacao-c.html" target="_blank">funções em C</a> é receber dados, através de parâmetros, trabalhar em cima dessas informações e retornar um determinado resultado.<br />
Assim, todas as opções desta questão da apostila estão corretas.<br />
<br />
Gabarito <b>E</b><br />
<b><br /></b>
<br />
<h3>
Questão 10:</h3>
O que é exibido através da função <b>printf</b> é sempre o que está dentro do primeiro par de aspas, ou seja: "%s%d%%".<br />
<br />
Vamos lá. A primeira coisa é uma string, representada por %s.<br />
Esse %s é o que exibe "Juros de "<br />
Já o %d serve para representar um número, no caso o 10.<br />
E por fim, para podermos imprimir o caractere % na tela, temos que usar o código %%.<br />
<br />
Gabarito <b>A</b><br />
<b><br /></b>
<br />
<h3>
Questão 11:</h3>
A sintaxe geral do laço for é:<br />
<b>for( inicial; teste; pós-teste)</b><br />
<b>{</b><br />
<b> código do</b><br />
<b> laço for</b><br />
<b>}</b><br />
<b><br /></b>
Como nosso laço tem uma única instrução, não é necessário estar entre colchetes:<br />
<b>for( inicial; teste; pós-teste)</b><br />
<b> instrução;</b><br />
<b><br /></b>
E como toda instrução feita na linguagem C, deve terminar por ponto e vírgula.<br />
<br />
Gabarito <b>D</b><br />
<b><br /></b>
<br />
<h3>
Questão 12:</h3>
A primeira parte do laço for é um simples comando de inicialização, geralmente usado para inicializar alguma variável com algum valor.<br />
Inclusive, esta inicialização é optativa.<br />
<br />
Em seguida é que ocorre o <i>looping</i> de fato.<br />
<br />
Gabarito <b>D</b>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com6tag:blogger.com,1999:blog-6926985245178197542.post-10735561870652413012014-01-12T14:15:00.001-08:002017-02-17T17:09:32.160-08:00Apostila de C completa - Resolução comentada da Apostila de C da UFMGQuem já procurou por Apostila de C no Google certamente já se deparou com o famoso curso de C que era oferecido pela UFMG, cujo material é disponibilizado até hoje, e é uma referência em material para estudar a linguagem C.<br />
<br />
<a name='more'></a><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Clique aqui e obtenha seu certificado Online de C</a><br />
<br />
<h2>
<span style="font-size: x-large;">Apostila de C resolvida e comentada</span></h2>
<a href="http://www.cprogressivo.net/2014/01/Apostila-de-C-Conceitos-Basicos-sobre-Linguagem-C-Lista-1.html" target="_blank">Lista 1 - Conceitos Básicos da Linguagem C</a><br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-de-C-Variavel-Operadores-Operacoes-Matematicas-Logicas.html" target="_blank">Lista 2 - Variáveis, Operadores, Operações Matemáticas e Lógicas</a><br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Testes-Condicionais-IF-ELSE-SWITCH-CASE-Lacos-WHILE-FOR-Operador-Ternario.html" target="_blank">Lista 3 - Testes Condicionais, Laços e Operador Ternário</a><br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-de-C-Ponteiro-Vetor-Matriz-String.html" target="_blank">Lista 4 e 5 - Ponteiro, Vetor, Matriz e String</a><br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-de-C-Funcao.html" target="_blank">Lista 6 - Função</a><br />
<a href="http://www.cprogressivo.net/2014/01/Apostila-C-Arquivos-Entrada-Saida-padrao.html" target="_blank">Lista 7 - Arquivos, Entrada e Saída Padrão</a><br />
<br />
<h2>
<span style="font-size: x-large;">Apostila completa de C para download</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
O Curso de C da UFMG é um material disponibilizado há quase 20 anos na internet brasileira, e se tornou um verdadeiro marco no ensino da linguagem C, tendo criado e treinado uma geração inteira de programadores C.<br />
<br />
Você pode acessar todo o material no seguinte endereço oficial:<br />
<a href="http://www.cpdee.ufmg.br/~renato/ProjetodeEnsino/PE97b-CursodeLinguagemC/_index.html" rel="nofollow" target="_blank">CPDEE (UFMG) </a><br />
<br />
<span style="color: red;">editado: </span>Acho que o site acima caiu, tentem:<br />
http://www2.dcc.ufmg.br/disciplinas/pc/source/introducao_c_renatocm_deeufmg.pdf<br />
<br />
Ou digitam 'apostila de C UFMG', vão achar vários sites<br />
<br />
Todo o conteúdo do material é disponibilizado de maneira gratuita e livre.<br />
Você pode inclusive fazer o <a href="http://www.cpdee.ufmg.br/~renato/ProjetodeEnsino/PE97b-CursodeLinguagemC/download.html" rel="nofollow" target="_blank">download da apostila de C</a>, compactado .zip, é só baixar, extrair e acessar o index.html<br />
<br />
A lista de exercícios que iremos resolver, você pode acessar no seguinte endereço:<br />
<a href="http://www.cpdee.ufmg.br/~renato/ProjetodeEnsino/PE97b-CursodeLinguagemC/lista_exercicio.html" rel="nofollow" target="_blank">http://www.cpdee.ufmg.br/~renato/ProjetodeEnsino/PE97b-CursodeLinguagemC/lista_exercicio.html</a><br />
<br />
Como vez e outra os sites saem do ar, mudam de endereço ou simplesmente são abandonados, nós decidimos fazer o upload do projeto e colocar em nossos servidores.<br />
<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<span style="color: red;">editado: </span>Acho que o site acima caiu, tentem:<br />
<a href="http://www2.dcc.ufmg.br/disciplinas/pc/source/introducao_c_renatocm_deeufmg.pdf">http://www2.dcc.ufmg.br/disciplinas/pc/source/introducao_c_renatocm_deeufmg.pdf</a><br />
<br />
Ou digitam 'apostila de C UFMG', vão achar vários sites<br />
<br />
<h2>
<span style="font-size: x-large;">Sobre a Apostila de C da UFMG</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Desde 1997 a Universidade Federal de Minas Gerais ofertava um curso de programação, usando a linguagem C, para os estudantes de engenharia. Não fazia parte oficial da grade, assim só fazia quem tinha real interesse no assunto.<br />
<br />
Ele era voltado mais para a Engenharia Elétrica (inclusive sendo escrito por alunos deste curso) e tinha uma particularidade (ainda mais para aquela época): era à distância.<br />
Os professores e monitores inclusive enviavam listas e mais listas de exercícios, através do e-mail, para os alunos.<br />
<br />
Como o foco do curso era no ensino à distância, criaram um excelente material, uma <b>apostila completa de C</b>, além de listas de exercícios e até testes para o aluno se auto-avaliar.<br />
<br />
O curso já foi encerrado há bastante tempo, mas para a alegria geral da nação, o material ainda continua online e disponível para qualquer um baixar e usar.<br />
Quando se falar em "Como começar a programar em C" em diversos fóruns e sites, o primeiro material é essa apostila.<br />
<br />
Aqui vemos o site atual do Departamento de Ensino à Distância da Escola de Engenharia, com o link para o <b>download da apostila em pdf</b>:<br />
<a href="http://www.matcomp.dcc.ufmg.br/index.php/artigos/apostilas/16-cursoc" rel="nofollow" target="_blank">http://www.matcomp.dcc.ufmg.br/index.php/artigos/apostilas/16-cursoc</a>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com0tag:blogger.com,1999:blog-6926985245178197542.post-29612838304524145072013-11-01T21:19:00.001-07:002018-11-23T09:42:50.637-08:00Lendo arquivos em C: As funções fgetc, fscanf e fgetsAgora que já aprendemos a <a href="http://www.cprogressivo.net/2013/11/Escrevendo-em-arquivos-As-funcoes-fputc-fprintf-fputs.html" target="_blank">escrever em arquivos em C</a>, vamos aprender agora em nossa <b>apostila de C</b> a outra parte: aprender como ler informações dos arquivos!<br />
<br />
Iremos aprender como ler caractere por caractere, ou um trecho pré-formatado ou linha por linha.<br />
Isso vai depender da necessidade de cada aplicativo em C.<br />
<ul>
<li>Leia este tutorial no seu computador ou celular: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<a name='more'></a><ul>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank"></a><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obtenha sua certificação de programação C para entrar no mercado de trabalho</a></li>
</ul>
<h2>
<span style="font-size: x-large;"><span style="color: red;"><i>fgetc()</i></span> - Como ler caracteres de um arquivo</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Se você leu o tutorial passado de nosso curso de C, vai notar que não tem muita diferença nem dificuldade na leitura de informações de um arquivo.</div>
<div>
<br /></div>
<div>
Quando estávamos trabalhando com os arquivos padrões (lendo informações do teclado), usávamos funções como <i>getchar</i>, <i>scanf</i> e <i>gets</i>.</div>
<div>
Aqui, iremos ensinar a usar funções correspondentes, porém para trabalhar com arquivos que estão armazenados em nosso disco rígido.</div>
<div>
<br /></div>
<div>
A única diferença entre leitura e escrita, é a posição do arquivos que vamos ler.</div>
<div>
Quando estávamos escrevendo, se usássemos o modo de abertura "w", escrevíamos desde o início do arquivo.</div>
<div>
Se fosse usando o "a", escrevíamos ao final do arquivo.</div>
<div>
<br /></div>
<div>
Já na leitura, vamos usar funções que iniciarão a leitura sempre do começo do arquivo.</div>
<div>
Quando usamos a função <i>fgetc</i>, por exemplo, ele lê o primeiro caractere e automaticamente já se posiciona no próximo. Ao ler o próximo, o C já se prepara para ler o próximo caractere do arquivo, e assim segue, até encontrar a constante <i style="font-weight: bold;">EOF</i>.</div>
<div>
<br /></div>
<div>
A sintaxe da função <i>fgetc</i> é:</div>
<div>
<span style="color: red;">int fgetc(FILE *arq)</span></div>
<div>
<br /></div>
<div>
Ela retorna um inteiro que representa o caractere, e <i style="font-weight: bold;">EOF</i>, que vale -1, caso aponte para o fim do arquivo. E como os caracteres são representados por inteiros que vão de 0 até 255, um caractere no arquivo nunca terá o valor -1, somente entre 0 e 255.</div>
<div>
<br /></div>
<div>
E como comentamos, uma coisa importante que ocorre 'por debaixo dos panos' é que após retornar um caractere, está função já passa a apontar para o próximo caractere, automaticamente, até encontrar -1 (<i style="font-weight: bold;">EOF</i>).</div>
<div>
<br /></div>
<h3>
Exemplo de código C - Programa que lê o conteúdo de um arquivo, caractere por caractere</h3>
<div>
<b>Faça um programa que leia de um arquivo "poema.txt" e imprima na tela, caractere por caractere.</b></div>
<div>
<br /></div>
<div>
Primeiramente, escreva algo no "poema.txt", pode ser um poema, seu nome completo, endereço etc.</div>
<div>
Escreva algo e coloque esse arquivo na mesma pasta do executável.</div>
<div>
Assim, nosso endereço é simplesmente "poema.txt", e como queremos ler, vamos usar o método de abertura "r".</div>
<div>
<br /></div>
<div>
Declaramos uma variável de nome "ch" do tipo <i>char</i>, que vai receber caractere por caractere do arquivo.</div>
<div>
Isso é feito usando o seguinte código:</div>
<div>
ch=fgetc(arq)</div>
<div>
<br /></div>
<div>
E isso deve ser feito enquanto o caractere apontando no arquivo não for <i style="font-weight: bold;">EOF</i>.</div>
<div>
Fazemos essa checagem assim:</div>
<div>
(ch=fgetc(arq))!= EOF</div>
<div>
<br /></div>
<div>
Assim, nosso programa que mostra todo o conteúdo de um arquivo na tela, é:</div>
<div>
<br /></div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">poema.txt</span><span style="color: maroon;">"</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">char</span> ch<span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">r</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> <span style="color: #808030;">(</span>ch<span style="color: #808030;">=</span><span style="color: #603000;">fgetc</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">EOF</span> <span style="color: #808030;">)</span>
<span style="color: #603000;">putchar</span><span style="color: #808030;">(</span>ch<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<div>
</div>
<br />
<div>
<br /></div>
<div>
<br /></div>
<h2>
Exercício resolvido - Contando o número de linhas de um arquivo</h2>
<div>
Escreva um programa que conte o número de linha do arquivo da questão anterior.</div>
<div>
<br /></div>
<div>
O que caracteriza uma linha?</div>
<div>
O caractere <i>new line</i> "\n".</div>
<div>
Para contar quantas linhas tem um arquivo de texto, basta percorrermos todos os caracteres do arquivo em busca dos "\n", pois cada caractere desse geralmente está no final de uma linha.</div>
<div>
<br /></div>
<div>
Vamos usar o código do exemplo passado deste tutorial para percorrer todos os caracteres, e cada vez que encontrar um "\n" incrementamos a variável "num", inicializada com 0.</div>
<div>
<br /></div>
<div>
Nosso código é:</div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">poema.txt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span>
ch<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> num<span style="color: #808030;">=</span><span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">r</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> <span style="color: #808030;">(</span>ch<span style="color: #808030;">=</span><span style="color: #603000;">fgetc</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">EOF</span> <span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>ch <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #0000e6;">'\n'</span><span style="color: #808030;">)</span>
num<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Existem </span><span style="color: #0f69ff;">%d</span><span style="color: #0000e6;"> linhas no arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<div>
</div>
<br />
<div>
<br /></div>
<h2>
<span style="font-size: x-large;"><i><span style="color: red;">fscanf()</span> </i>- Lendo uma entrada formatada</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Assim como é possível escrever de maneira formatada através das funções <i>printf</i> e <i>fprintf</i>, também podemos ler de maneira formatada, como é possível na <i>scanf</i>, através do uso da função <i>fscanf</i>.</div>
<div>
<br /></div>
<div>
Isso é particularmente interessante se tivermos um arquivo com um determinado formato.</div>
<div>
Ou seja, quando o conteúdo do arquivo obedecer um determinado padrão.</div>
<div>
<br /></div>
<div>
Por exemplo, vamos supor que você tenha uma lista com notas de 3 alunos.</div>
<div>
Na primeira coluna as notas de Matemática, na segunda as de Física e na terceira coluna as notas de Química.</div>
<div>
Cada linha é representada como: "%f %f %f\n"</div>
<div>
Ou seja: número, espaço em branco, número, espaço em branco, número.e o <i>new line</i>.</div>
<div>
Este é o formato, este é o padrão.</div>
<div>
<br /></div>
<div>
A sintaxe da <i>fscanf</i> é:</div>
<div>
int fscanf(FILE *arq, char *string_formatada)</div>
<div>
<br /></div>
<div>
Como as outras, retorna <i style="font-weight: bold;">EOF</i> caso não tenha conseguido fazer a leitura de maneria correta.</div>
<div>
<br /></div>
<h3>
Exemplo de código - Como usar a <i>fscanf</i></h3>
<div>
<b>Suponha que tenhamos um arquivo de texto chamado "arquivo.txt" com o seguinte conteúdo:</b></div>
<div>
<b><span style="color: red;">a b c</span></b></div>
<div>
<b><span style="color: red;">d e f</span></b></div>
<div>
<b><span style="color: red;">g h i</span></b></div>
<div>
<b><span style="color: red;">j k l</span></b></div>
<div>
<b>Como usar a <i>fscanf</i> para lê-lo?</b></div>
<div>
<br /></div>
<div>
Basta notar que o formato desse arquivo é: caractere, espaço, caractere, espaço, caractere e enter</div>
<div>
Ou seja: "%c %c %c\n"</div>
<div>
O formato se repete lina por linha, onde temos que receber 3 caracteres por linha.</div>
<div>
Então vamos salvar esses três em três variáveis do tipo <i>char</i> e exibi-las.</div>
<div>
<br /></div>
<div>
Nosso código para ler e exibir esses caracteres é:</div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">arquivo.txt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span>
ch1<span style="color: #808030;">,</span> ch2<span style="color: #808030;">,</span> ch3<span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">r</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> <span style="color: #808030;">(</span><span style="color: #603000;">fscanf</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">,</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%c</span><span style="color: #0000e6;"> </span><span style="color: #0f69ff;">%c</span><span style="color: #0000e6;"> </span><span style="color: #0f69ff;">%c</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>ch1<span style="color: #808030;">,</span> <span style="color: #808030;">&</span>ch2<span style="color: #808030;">,</span> <span style="color: #808030;">&</span>ch3<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: #808030;">!</span><span style="color: #808030;">=</span><span style="color: #7d0045;">EOF</span> <span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%c</span><span style="color: #0000e6;"> </span><span style="color: #0f69ff;">%c</span><span style="color: #0000e6;"> </span><span style="color: #0f69ff;">%c</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> ch1<span style="color: #808030;">,</span> ch2<span style="color: #808030;">,</span> ch3<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<div>
</div>
<br />
<div>
<br /></div>
<h2>
Exemplo de código - Nomes, notas e média</h2>
<div>
<b>Em um arquivo chamado "notas.txt" está os dados dos nomes e notas de alunos.</b></div>
<div>
<b>Em cada linha há o nome do aluno, seguido de três notas:</b></div>
<div>
<b><span style="color: red;">Maria 8 8 10</span></b></div>
<div>
<b><span style="color: red;">Jose 6 6 8</span></b></div>
<div>
<b><span style="color: red;">Carlos 7 9.5 7.5</span></b></div>
<div>
<b><span style="color: red;">Programador 10 10 10</span></b></div>
<div>
<b><br /></b></div>
<div>
<b>Crie um programa que exiba o nome de cada aluno e sua média.</b></div>
<div>
<br /></div>
<div>
A primeira coisa que devemos fazer é analisar o conteúdo do arquivo e procurar por padrões.</div>
<div>
Nesse caso, o padrão se repete em toda linha, pois todas as linhas são iguais: string, espaço, número, espaço, número, espaço, número, enter</div>
<div>
Ou seja: <span style="color: red;">"%s %f %f %f\n"</span></div>
<div>
<br /></div>
<div>
Como há um padrão em toda linha, podemos usar a <i>fscanf</i> para armazenar esses dados.<br />
Vamos precisar de uma string e três <i>floats</i>.</div>
<div>
Após pegar esses dados, exibimos o nome do aluno e a média das notas.</div>
<div>
<br /></div>
<div>
Nosso código em C fica:</div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">notas.txt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span>
nome<span style="color: #808030;">[</span><span style="color: #008c00;">20</span><span style="color: #808030;">]</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">float</span> nota1<span style="color: #808030;">,</span> nota2<span style="color: #808030;">,</span> nota3<span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">r</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> <span style="color: #808030;">(</span><span style="color: #603000;">fscanf</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">,</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%s</span><span style="color: #0000e6;"> </span><span style="color: #0f69ff;">%f</span><span style="color: #0000e6;"> </span><span style="color: #0f69ff;">%f</span><span style="color: #0000e6;"> </span><span style="color: #0f69ff;">%f</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> nome<span style="color: #808030;">,</span> <span style="color: #808030;">&</span>nota1<span style="color: #808030;">,</span> <span style="color: #808030;">&</span>nota2<span style="color: #808030;">,</span> <span style="color: #808030;">&</span>nota3<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: #808030;">!</span><span style="color: #808030;">=</span><span style="color: #7d0045;">EOF</span> <span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%s</span><span style="color: #0000e6;"> teve media </span><span style="color: #0f69ff;">%.2f</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> nome<span style="color: #808030;">,</span> <span style="color: #808030;">(</span>nota1<span style="color: #808030;">+</span>nota2<span style="color: #808030;">+</span>nota3<span style="color: #808030;">)</span><span style="color: #808030;">/</span><span style="color: #008c00;">3</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<div>
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br /></div>
<h2>
<span style="font-size: x-large;"><span style="color: red;"><i>fgets()</i></span> - Capturando linha</span></h2>
<div>
Usávamos a função <i>gets</i> para capturar uma string do teclado do usuário.</div>
<div>
Ela pegava do primeiro caractere até encontrar o <i>new line</i>("\n"), e colocava o caractere delimitador ao final ("\0").</div>
<div>
<br /></div>
<div>
Muitas vezes é interessante pegar uma linha inteira de um arquivo, principalmente se nesse arquivo existir textos.</div>
<div>
Para fazer esta tarefa, uma boa opção é usar a função <i>fgets</i>, cuja sintaxe é:</div>
<div>
char *fgets(char *minhaString, int numBytes, FILE *arq)</div>
<div>
<br /></div>
<div>
Essa função vai abrir o arquivo apontado por <i>arq</i> e vai pegar do primeiro caractere até o <i>new line</i>, ou até o limite de "numBytes" <i>bytes</i> e vai armazenar essa string na "minhaString".</div>
<div>
<br /></div>
<div>
Ou seja, vamos usar ela para pegar cada linha de um arquivo e armazenar na forma de string.</div>
<div>
Por exemplo, escreva em um arquivo "dados.txt"o seguinte conteúdo:</div>
<div>
<span style="color: red;">"Meu nome: [escreva seu nome completo]</span></div>
<div>
<span style="color: red;">Moro em: [escreva seu endereço]</span></div>
<div>
<span style="color: red;">Estudo pelo C Progressivo</span></div>
<div>
<span style="color: red;">E pretendo ser programador C"</span></div>
<div>
<br /></div>
<div>
Agora vamos criar um programa que vai ler e exibir esses dados:</div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">dados.txt</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span>
info<span style="color: #808030;">[</span><span style="color: #008c00;">50</span><span style="color: #808030;">]</span><span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">r</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> <span style="color: #808030;">(</span><span style="color: #603000;">fgets</span><span style="color: #808030;">(</span>info<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>info<span style="color: #808030;">)</span><span style="color: #808030;">,</span> arq<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: #808030;">!</span><span style="color: #808030;">=</span><span style="color: #7d0045;">NULL</span> <span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%s</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> info<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<pre><span style="color: purple;">
</span></pre>
<div>
</div>
<br />
<div>
Podemos usar cada linha dessas e armazenar em uma string diferente (string que guarda o nome, outra que guarda o endereço, outra que guarda o CPF, RG etc, igual aqueles formulários que preenchemos na internet).</div>
<div>
<br /></div>
<div>
Vale notar que, como a <i>fgets</i> retorna uma string, para checar se chegamos ao fim do arquivo, basta checarmos se o retorno dela é diferente de <i>NULL</i>.</div>
Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com16tag:blogger.com,1999:blog-6926985245178197542.post-58714509932653239462013-11-01T15:31:00.001-07:002018-11-23T09:39:36.274-08:00Escrevendo em arquivos - As funções fputc(), fprintf() e fputs()Agora que já aprendemos as <a href="http://www.cprogressivo.net/2013/10/Operacoes-com-arquivos-FILE-fopen-modos-de-abertura-fechamento-modo-texto-binario-EOF-fclose-fcloseall.html" target="_blank">operações básicas com arquivos, como abrir e fechar</a>, podemos finalmente trabalhar com eles em nossos projetos.<br />
<br />
Neste tutorial de nossa <b>apostila de C</b>, iremos ensinar como escrever em arquivos através das funções <i>fputc</i>, <i>fprintf</i> e <i>fputs</i>.<br />
<ul>
<li>Download do curso: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<a name='more'></a><ul>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank"></a><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Deseja entrar no mercado de trabalho? Obtenha sua certificação aqui</a></li>
</ul>
<h2>
<span style="font-size: x-large;">Arquivos padrões - <i>Standard stdin, stdout</i> e <i>stderr</i></span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Antes de iniciarmos a escrita nos arquivos, se faz necessário explicar alguns detalhes sobre como os arquivos são vistos em programação C.</div>
<div>
<br /></div>
<div>
A troca de informações em um sistema pode se dar de várias maneiras.</div>
<div>
Até o momento em nosso curso de C, fizemos isso através da interação teclado-programa-tela, onde o usuário fornece os dados via teclado, o programa processa essa informação, e exibe algo na tela.</div>
<div>
<br /></div>
<div>
Outra maneira de trocar informações é através da impressora ou de um scanner.</div>
<div>
Ou seja, podemos receber informações através de um dispositivo externo (como um leitor de códigos em barra), bem como podemos mandar dados para uma impressora.</div>
<div>
<br /></div>
<div>
E nesta seção, focaremos em um tipo específico de troca de informações, que é através de arquivos localizados no disco magnético de seu computador. Podemos tanto pegar informações dele, como escrever algo em seu HD através da linguagem C.</div>
<div>
<br /></div>
<div>
Resumindo: existem várias maneiras de se trocar informações, e sempre está surgindo novas. Por exemplo, as tecnologias WiFi e <i>Bluetooth.</i> Visando facilitar, as coisas foram padronizadas como sendo arquivos.</div>
<div>
<br /></div>
<div>
Ou seja, quando fornecemos dados por meio de um teclado, essas informações são passadas em série, por meio de <i>stream</i>, como se fosse um arquivo, embora este não exista.</div>
<div>
Nosso programa em C vai ler esses dados do teclado COMO SE FOSSE um arquivo.</div>
<div>
Isso ocorre porque ao criar um programa em C, estamos automaticamente usando alguns tipos de arquivos.</div>
<div>
<br /></div>
<div>
Mesmo que apenas tenhamos a interação teclado-programa-tela, existem alguns arquivos abertos, e os mais importantes são:</div>
<div>
<ul>
<li><b>stdin </b>- é o arquivo de entrada padrão. Até o momento, para nós, foi o teclado.</li>
<li><b>stdout</b> - é o arquivo de saída padrão. Até o momento, nossa saída padrão é a tela do computador, através do terminal de comando.</li>
<li><b>stderr</b> - arquivo padrão de erro, onde podemos direcionar mensagens de erro para outro local sem ser o da saída padrão, como para um <i>log</i> (espécie de registro de ações)</li>
</ul>
</div>
<div>
<br /></div>
<div>
Além desses, outros arquivos como o <i>stdaux</i> (dispositivo auxiliar, geralmente a porta COM1) e o <i>stdprn</i>(impressora padrão), são abertos automaticamente.</div>
<div>
Por isso, podemos usar a vontade funções como <i>printf</i>, <i>scanf</i>, <i>putc</i> e outras.</div>
<div>
<br /></div>
<div>
Mas agora não vamos mais usar essas entradas e saídas padrão, e sim arquivos, por isso iremos fornecer algumas informações especiais aos nossos programas, informações sobre as entradas e saídas, que serão em formas de arquivos salvos na sua máquina.</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;"><i><span style="color: red;">fputc()</span> </i>- Como escrever um caractere em um arquivo</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Sem mais delongas, vamos as vias de fato e finalmente aprender a criar e escrever em um arquivo externo de nosso computador.</div>
<div>
<br /></div>
<div>
Para fazer isso vamos usar a função fputc(), que recebe dois dados: o caractere e o <i>FILE*</i>, que terá as informações do local onde iremos escrever o dito caractere:</div>
<div>
<br /></div>
<div>
<span style="color: red;">int fputc(int char, FILE *arq);</span></div>
<div>
<br /></div>
<div>
Essa função retorna <i>EOF</i> caso não tenha conseguido escrever no arquivo, ou retorna o inteiro que representa o caractere, caso tenha ocorrido.</div>
<div>
<br /></div>
<h3>
Exemplo de código - Escrevendo um caractere em um arquivo</h3>
<div>
<b>Escreva um programa que peça um caractere para o usuário e salve esta entrada em um arquivo chamado "char.txt", localizado na mesma pasta do programa executável.</b></div>
<div>
<br /></div>
<div>
Vamos inicialmente definir nosso endereço através de uma string (<i>char url[])</i>, que é simplesmente "char.txt", bem como o caractere <i>ch</i> para armazenar o caractere que o usuário digitar.</div>
<div>
<br /></div>
<div>
Como queremos salvar o <i>char</i> em um arquivo, criamos um ponteiro <i>arq</i> do tipo <i>FILE</i>.</div>
<div>
Em seguida, pedimos para o usuário digitar algum caractere, que capturamos através da função <i>getchar()</i> e salvamos em <i>ch</i>.</div>
<div>
<br /></div>
<div>
Agora vamos abrir um arquivo para escrever, e isso é feito através da função <i>fopen()</i>, que vai receber a string com a localização do arquivo (isto está armazenado na variável <i>url</i>) e o modo de abertura.</div>
<div>
Como queremos escrever, o modo é o <i>"w"</i>.</div>
<div>
<br /></div>
<div>
Para checarmos se abertura do arquivo foi realmente efetuada, testamos se a <i>fopen</i> não retornou NULL para <i>arq</i>. Caso não, vamos escrever o caractere no arquivo.</div>
<div>
Isso é feito pela função <i>fputc</i>, que diferente da <i>putchar</i> que necessita só do caractere, ela também necessita saber onda vai ser a saída (pois não é mais a saída padrão, a tela).</div>
<div>
<br /></div>
<div>
Essa saída é indicada pelo vetor <i>arq</i>. E pronto, caractere salvo no arquivo "char.txt".</div>
<div>
Mas antes de finalizar o programa, devemos adotar a boa prática de programação que nossa <b>apostila de C</b> ensinou: fechar os arquivos, usando a <i>fclose</i> e passando o <i>arq</i> como argumento.</div>
<div>
Nosso código C ficou:</div>
<div>
<br /></div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">char.txt</span><span style="color: maroon;">"</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">char</span> ch<span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Caractere: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
ch<span style="color: #808030;">=</span><span style="color: #603000;">getchar</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">w</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
<span style="color: #603000;">fputc</span><span style="color: #808030;">(</span>ch<span style="color: #808030;">,</span> arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<div>
</div>
<br />
<div>
<br /></div>
<div>
Pronto, agora vá na pasta onde está localizado seu executável e vai ver que foi criado um arquivo chamado "<i>char.txt</i>", e dentro dele está o caractere que você digitou.</div>
<div>
Pode fechar o programa, reiniciar a máquina ou fazer o que quiser, que o dito cujo arquivo vai continuar no seu HD.</div>
<div>
<br /></div>
<div>
Bacana, não?</div>
<div>
Agora experimente rodar de novo o programa, escrevendo outro caractere.</div>
<div>
Veja que o antigo foi substituído. Isso ocorreu devido ao modo de abertura, "w".</div>
<div>
<br /></div>
<h3>
Exemplo de código - Adicionando caractere com o modo "a" (<i>append</i>)</h3>
<div>
<b>Crie um programa semelhante ao anterior, mas em vez de substituir o caractere, ADICIONE um caractere ao fim do arquivo.</b></div>
<div>
<b>Escreva no arquivo: "C Progressivo"</b></div>
<div>
<br /></div>
<div>
Para escrever um texto em sequência, temos que alterar apenas uma coisa: o modo de abertura, de "w" para "a", assim sempre que escrevermos algo, será inserido ao final, anexando, em vez de substituir.</div>
<div>
<br /></div>
<div>
Vamos criar um <a href="http://www.cprogressivo.net/2013/02/O-que-e-e-como-usar-o-laco-DO-WHILE-em-linguagem-C.html" target="_blank">looping do while</a> para pedir caracteres ao usuário, e este laço só termina se digitarmos enter (caractere '\n').</div>
<div>
Como vamos 'mexer' várias vezes no arquivo, abrimos ele antes do looping e fechamos depois.</div>
<div>
Nosso código fica:</div>
<div>
<br /></div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">char.txt</span><span style="color: maroon;">"</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">char</span> ch<span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">a</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span></pre>
<pre> <span style="color: maroon; font-weight: bold;">do</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Caractere: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
ch<span style="color: #808030;">=</span><span style="color: #603000;">getchar</span><span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fflush</span><span style="color: #808030;">(</span><span style="color: #603000;">stdin</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fputc</span><span style="color: #808030;">(</span>ch<span style="color: #808030;">,</span> arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>ch <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #0000e6;">'\n'</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<div>
</div>
<br />
<div>
<br /></div>
<div>
Digite caractere por caractere, inclusive espaço, o seguinte: C Progressivo</div>
<div>
Em seguida dê enter para terminar.</div>
<div>
Veja como ficou seu arquivo <i>char.txt</i></div>
<div>
<br /></div>
<div>
Agora rode o programa de novo, e digite outra coisa qualquer e dê enter ao final.</div>
<div>
Veja novamente seu arquivo! Vai ver que o que tinha antes não foi apagado, e o que digitou depois está na linha de baixo.</div>
<div>
Interessante, não?</div>
<div>
<br /></div>
<div>
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;"><span style="color: red;"><i>fprintf()</i></span> - Escrevendo textos (strings) em arquivos</span></h2>
<div>
Embora interessante, e importante, a escritura de caracteres em arquivos, ela é um pouco limitada.</div>
<div>
Afinal, é incômodo escrever caractere por caractere.</div>
<div>
<br /></div>
<div>
Para isso, existe a função <i>fprintf</i>, que nos permite escrever strings inteiras em arquivos.</div>
<div>
Sua sintaxe simplificada é:</div>
<div>
int fprintf(FILE *arq, char string[])</div>
<div>
<br /></div>
<div>
Ou seja, recebe o local onde deve direcionar a saída (para um arquivo, apontado pelo ponteiro <i>arq</i> do tipo <i>FILE</i>), e a string que devemos adicionar em tal arquivo.</div>
<div>
Essa função retorna <i>EOF</i> em caso de erro.</div>
<div>
<br /></div>
<h3>
Exemplo de código - Armazenando notas, calculando a média e escrevendo no arquivo</h3>
<div>
Escreva um programa em C que peça 3 notas de um aluno (Matemática, Física e Química), e salve esses dados em um arquivo chamado "notas.txt", que deve ter, ao final, a média das três disciplinas.</div>
<div>
<br /></div>
<div>
Vamos definir a nossa url como "notas.txt" e criar duas variáveis do tipo <i>float</i>, a "nota" (que vai armazenar a nota de cada matéria) e a "media" (que vai somar todas as notas, depois se dividir por 3 para ter a média).</div>
<div>
<br /></div>
<div>
A cada vez que pedimos uma nota, adicionamos uma linha de informação ao nosso arquivo, e ao final escrevemos a média.</div>
<div>
O interessante é que nossa saída de dados é o arquivo, e não mais a tela. Assim, embora exista saída, nós não vemos na tela, só no arquivo.</div>
<div>
<br /></div>
<div>
Veja como ficou nosso código:</div>
<div>
<br /></div>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> url<span style="color: #808030;">[</span><span style="color: #808030;">]</span><span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">notas.txt</span><span style="color: maroon;">"</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">float</span> nota<span style="color: #808030;">,</span>
media<span style="color: #808030;">=</span><span style="color: green;">0.0</span><span style="color: purple;">;</span>
<span style="color: #603000;">FILE</span> <span style="color: #808030;">*</span>arq<span style="color: purple;">;</span>
arq <span style="color: #808030;">=</span> <span style="color: #603000;">fopen</span><span style="color: #808030;">(</span>url<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">w</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>arq <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Erro, nao foi possivel abrir o arquivo</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Nota de Matematica: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%f</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>nota<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fprintf</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Matematica: </span><span style="color: #0f69ff;">%.2f</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> nota<span style="color: #808030;">)</span><span style="color: purple;">;</span>
media<span style="color: #808030;">+</span><span style="color: #808030;">=</span>nota<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Nota de Fisica: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%f</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>nota<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fprintf</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Fisica: </span><span style="color: #0f69ff;">%.2f</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> nota<span style="color: #808030;">)</span><span style="color: purple;">;</span>
media<span style="color: #808030;">+</span><span style="color: #808030;">=</span>nota<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Nota de Quimica: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%f</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>nota<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">fprintf</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Quimica: </span><span style="color: #0f69ff;">%.2f</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> nota<span style="color: #808030;">)</span><span style="color: purple;">;</span>
media<span style="color: #808030;">+</span><span style="color: #808030;">=</span>nota<span style="color: purple;">;</span>
media <span style="color: #808030;">/</span><span style="color: #808030;">=</span> <span style="color: #008c00;">3</span><span style="color: purple;">;</span>
<span style="color: #603000;">fprintf</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">,</span> <span style="color: maroon;">"</span><span style="color: #0000e6;">Media final: </span><span style="color: #0f69ff;">%.2f</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> media<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">fclose</span><span style="color: #808030;">(</span>arq<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<div>
</div>
<br />
<div>
<br /></div>
<div>
E se a <i>fputc </i>é a equivalente da <i>putc</i>, bem como a <i>fprintf</i> é a equivalente da <i>printf</i>, fica óbvio saber qual a função da <i>fputs</i>: é a mesma da <i>puts</i>, cuja a saída é uma string com o <i>new line</i> "\n" no final.</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">Exercício sobre escrita de dados em C</span></h2>
<div>
Escreva um programa que peça números decimais ao usuário, até que ele digita 0.</div>
<div>
Salve todos os números digitados em um arquivo chamado "dados.txt", que mostra a média desses números no final do arquivo.</div>
Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com10tag:blogger.com,1999:blog-6926985245178197542.post-86299112049553488222013-10-31T21:11:00.003-07:002018-11-23T09:34:41.575-08:00Operações com arquivos: Modos de abertura (FILE e fopen), fechamento (EOF, fclose e fcloseall), modo texto e binárioNo tutorial passado de nossa <b>apostila de C</b>, falamos sobre <a href="http://www.cprogressivo.net/2013/10/Arquivos-Files-em-C.html" target="_blank">o que são e a importância dos arquivos em linguagem C</a>, onde mostramos que para termos programas mais robustos e flexíveis, seria necessário fazer uma comunicação entre nossos aplicativos e o sistema.<br />
<br />
Essa comunicação é feita através dos arquivos, que servem tanto para fornecer informações para nossos programas, como para salvar dados deles.<br />
<br />
Neste artigo vamos entrar em detalhes sobre a abertura, fechamento e outras operações com arquivos.<br />
<ul>
<li>Baixe o conteúdo do site: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila de C</a></li>
</ul>
<a name='more'></a><ul>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank"></a><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Certificado de programação em C</a></li>
</ul>
<h2>
<span style="font-size: x-large;">O que são arquivos</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Basicamente, arquivos são dados.</div>
<div>
Mas por dados, podemos estar dizendo muita coisa.</div>
<div>
No contexto geral, quando falamos em arquivos podemos estar nos referindo por um arquivo de texto, uma imagem, uma música, um programa de edição de imagem ou o executável que você criou estudando pelo nosso <a href="http://www.cprogressivo.net/" target="_blank">curso de C</a>.</div>
<div>
<br /></div>
<div>
Porém, para o computador (leia-se: hardware), é tudo bit.</div>
<div>
Tudo é visto como 1s (true, estado alto) ou 0s (false, estado baixo).</div>
<div>
Na verdade, quem já estudou eletrônica, sabe que isso de 1 e 0 é apenas uma abstração, o que ocorre de fato é a existência de voltagem baixa (bit 0) e alta (bit 1), ou existência ou não de corrente.</div>
<div>
<br /></div>
<div>
Existem diversas maneiras de se representar um arquivo, além de toda uma estrutura e hierarquia de dados, sendo o sistema de arquivos de um sistema operacional um ramo bem complexo de estudo.</div>
<div>
<br /></div>
<div>
Em nossa apostila, você pode entender o conceito de arquivo apenas como uma série de <i>bytes</i>, de informações dispostas de maneira sequencial (<i>stream</i>), onde teremos informações e controle sobre seu início e fim.</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">Modo texto e binário</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Como dissemos ao longo de nosso curso, a linguagem C é extremamente poderosa e nos oferece a possibilidade da fazer praticamente qualquer coisa com nossas máquinas (e não só microcomputadores).</div>
<div>
<br /></div>
<div>
Uma dessas capacidades é possibilidade de trabalhar com arquivos no modo binário.</div>
<div>
Ou seja, podemos abrir, criar e salvar um arquivo no modo binário.</div>
<div>
Por exemplo, é possível fazer uma cópia binária de arquivo. Isto é, pegar bit por bit de um executável e colocar em outro arquivo, duplicando o arquivo.</div>
<div>
<br />
Porém, hardware é que se dá bem e gosta de trabalhar com bit (quem <a href="http://www.assemblyprogressivo.net/" target="_blank">programa em Assembly</a> também :). Para humanos, uma lista de milhões ou bilhões de números 1 e 0 é algo quase impossível de ser interpretado.</div>
<div>
<br /></div>
<div>
Por isso, os programadores geralmente trabalham com arquivos em modo texto, que será o foco aqui de nossa apostila. Basicamente iremos tratar de arquivos em texto, como os de extensão .txt, que nada mais serão do que uma lista de caracteres (dígitos, letras e símbolos, como espaço e acentuação).</div>
<div>
<br /></div>
<div>
Mais adiante neste tutorial, iremos explicar em detalhes como trabalhar com arquivos em modo texto ou modo binário.<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">Como abrir um arquivo: A função <span style="color: red;">fopen()</span> e o ponteiro <span style="color: red;">FILE</span></span></h2>
<div>
Para abrir, alterar ou criar um arquivo em seu HD é necessário criar uma espécie de vínculo entre seu programa e um determinado endereço de memória, onde está localizado (ou vai se localizar) o arquivo.</div>
<div>
<br /></div>
<div>
Essa ligação é um pouco mais complexa e de 'baixo nível', mas isso não será motivo de preocupação, pois na linguagem C existe um tipo de dado, o <i style="font-weight: bold;">FILE</i>, que serve para trabalharmos especificamente com arquivos, e já está inclusive na biblioteca padrão do C, assim, podemos usar sem nos preocupar em incluir biblioteca ou criar algum código.</div>
<div>
<br /></div>
<div>
Essa ligação, entre nosso programa e seu disco de dados é feita através de um ponteiro.</div>
<div>
Tal ponteiro é do tipo <i style="font-weight: bold;">FILE</i>, e o nome você escolhe.</div>
<div>
A sintaxe é a de criação de um <a href="http://www.cprogressivo.net/p/aprenda-tudo-sobre-ponteiros-em-c.html" target="_blank">ponteiro</a>:</div>
<div>
<span style="color: red;">FILE *arquivo;</span></div>
<div>
<br /></div>
<div>
Assim, nova variável <i>arquivo</i>, do tipo <i>FILE</i>, será a relação entre nosso programa em C e o arquivo que iremos trabalhar. </div>
<div>
Porém, sabemos que o ponteiro deve apontar para um tipo específico de dados, que no nosso caso é o tipo <i style="font-weight: bold;">FILE</i>.</div>
<div>
<br /></div>
<div>
Mas ele precisa apontar para 'alguém', só ter a referência (endereço de memória onde o ponteiro aponta) não serve de muita coisa. E é aí que entra a função <i style="font-weight: bold;">fopen()</i>.</div>
<div>
<br /></div>
<div>
A função <i>fopen()</i> serve para especificarmos algumas características do arquivo.</div>
<div>
Especificamente, como pode ser visto na declaração desta função, precisamos fornecer dois dados:</div>
<div>
Endereço do arquivo no seu computador (representado por uma <a href="http://www.cprogressivo.net/p/strings-e-caracteres-em-c.html" target="_blank">string</a>)</div>
<div>
Modo de abertura do arquivo (outra string contendo o método de abertura)</div>
<div>
<br /></div>
<div>
O protótipo dessa função é:</div>
<div>
FILE *fopen(const char *filename, const char *mode)</div>
<div>
<br /></div>
<h3>
Nome de um arquivo</h3>
<div>
Para associar nossa variável ponteiro para um arquivo que será lido ou criado em seu computador, é necessário que você forneça a localização desse arquivo, afinal o C não pode adivinhar isso.</div>
<div>
<br /></div>
<div>
Isso é feito através de uma string passada para a função <i>fopen()</i>, e essa string deve conter o endereço completo do arquivo, e isso inclui o nome do arquivo.</div>
<div>
Vamos supor que vamos trabalhar com um arquivo chamado "<i>arquivo.txt</i>".</div>
<div>
<br /></div>
<div>
Se queremos usar este arquivo e ele está na MESMA PASTA (ou diretório) do seu executável, precisamos apenas fornecer o nome completo (com extensão) do arquivo:</div>
<div>
"<i>arquivo.txt</i>"</div>
<div>
<br /></div>
<div>
E caso ele esteja em outra pasta, como no C: ?</div>
<div>
Fornecemos o caminho inteiro, que é C:\arquivo.txt</div>
<div>
<br /></div>
<div>
Porém, aqui vai um detalhe que é um erro bem comum entre iniciantes: para representar a barra "\" em uma string, usamos DUAS BARRAS: \\</div>
<div>
<br /></div>
<div>
Assim, nossa string seria: "C:\\arquivo.txt"</div>
<div>
Se o arquivo estiver numa pasta (vamos chamar de "meus_arquivos", dentro da pasta que está o executável, fazemos: "meus_arquivos\\arquivo.txt"</div>
<div>
<br /></div>
<div>
Ou podemos pedir o endereço para o usuário, que poderá escrever usando apenas uma barra "\", pois a representação dela em string é "\\" e o C faz essa interpretação automaticamente.</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">Modos de abertura: read (<span style="color: red;">r</span>), write (<span style="color: red;">w</span>) e append(<span style="color: red;">a</span>)</span></h2>
<h3>
read(r) - Leitura de arquivo</h3>
<h4>
r</h4>
<div>
Sempre que quisermos ler um arquivo, usamos o modo <i>read</i>, que será representado simplesmente pela letra "r":</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "r")</span>;</div>
<div>
<br /></div>
<div>
Isso faz o arquivo ser aberto unicamente para ser lido (não podemos alterar nada).</div>
<div>
<br /></div>
<h4>
r+</h4>
<div>
Se adicionarmos um sinal de "+" no "r", será possível abrir o arquivo tanto para leitura como para escrita, e caso ele não exista, será automaticamente criado.</div>
<div>
E caso exista, o seu conteúdo anterior será apagado e substituído pelo novo:</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "r+")</span></div>
<div>
<br /></div>
<h4>
rb</h4>
<div>
Abre o arquivo para leitura, mas em modo binário:</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "rb")</span></div>
<div>
<br /></div>
<h3>
write(w) - Escrita em arquivo</h3>
<h4>
w</h4>
<div>
Para abrirmos um arquivo para escrita (colocar informações do nosso programa no arquivo), usamos a letra "w". Esse modo automaticamente cria o arquivo, ou substitui seu conteúdo anterior:</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "W")</span></div>
<div>
<span style="color: red;"><br /></span></div>
<h4>
w+</h4>
<div>
Abertura do arquivo tanto para leitura como para escrita.</div>
<div>
Caso já exista o arquivo, seu conteúdo será substituído:</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "w+")</span></div>
<div>
<br /></div>
<h4>
wb</h4>
<div>
Escrita em arquivos no modo binário:</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "wb")</span></div>
<div>
<br /></div>
<h3>
append(a) - Escrevendo ao final do arquivo (anexando)</h3>
<h4>
a</h4>
<div>
Ao usar o "w" para escrever (<i>write</i>), começamos a inserir informação no início do arquivo.</div>
<div>
Mas, e se quisermos inserir ao final? Se não quisermos apagar o que tinha lá antes?</div>
<div>
<br /></div>
<div>
Para isso vamos ANEXAR, informações! Anexar em inglês é <i>append</i>, e fazemos isso abrindo o arquivo usando o modo de abertura "a":</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "a")</span></div>
<div>
<br /></div>
<h4>
a+</h4>
<div>
Caso queiramos abrir um arquivo para leitura ou para escrita ao FINAL do arquivo (anexar), usamos o símbolo "+" depois da letra "a":</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "a+")</span></div>
<div>
<br /></div>
<h4>
ab</h4>
<div>
Por afim, assim como na leitura "rb" e escrita binária "wb", podemos anexar informações ao final do arquivo, de maneira binária usando o "ab":</div>
<div>
<span style="color: red;">FILE *arquivo = fopen("arquivo.txt", "ab")</span></div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;"><span style="color: red;">EOF</span> (<i>end of file)</i>, final do arquivo - Fechando arquivos com <i><span style="color: red;">fclose()</span></i> e <i><span style="color: red;">fcloseall()</span></i></span></h2>
<div>
Para saber o final do arquivo (que para o sistema, é uma sequência de bytes), o C vai procurar um sinal, uma constante conhecida por <i style="font-weight: bold;">EOF</i>, que sinaliza o final do arquivo.</div>
<div>
<br /></div>
<div>
Para identificar o final de um arquivo, podemos usar a função <i>fclose</i>, que recebe um ponteiro para o tipo <i style="font-weight: bold;">FILE</i> e retorna um inteiro:</div>
<div>
<span style="color: red;">int fclose(FILE *arq)</span></div>
<div>
<br /></div>
<div>
Caso o byte lido represente o <i style="font-weight: bold;">EOF</i>, a função "fecha" a abertura do arquivo. Ou seja, libera a memória associado ao ponteiro do <i style="font-weight: bold;">FILE*</i>.</div>
<div>
<br /></div>
<div>
Assim como ensinamos em ponteiros, ao usar a <a href="http://www.cprogressivo.net/2013/10/Funcao-free-Como-liberar-memoria-e-evitar-vazamento.html" target="_blank">função free() para liberar memória alocada</a>, fechar os arquivos que você não está mais usando é uma excelente prática de programação.</div>
<div>
<br /></div>
<div>
E caso trabalhe com diversos arquivos, você poderá fechá-los todos de uma vez, através da função:</div>
<div>
<span style="color: red;">int fcloseall()</span></div>
<h2>
<span style="font-size: x-large;">Erros em abertura de arquivos</span></h2>
<div>
Quando abrimos um arquivo, o ponteiro que criamos do tipo <i style="font-weight: bold;">FILE</i> armazenará o endereço de um arquivo.</div>
<div>
<br /></div>
<div>
Porém, nem sempre esta tarefa é possível, gerando um erro.</div>
<div>
Quando este erro ocorre o ponteiro irá apontar para NULL, sendo essa prática (checagem se o ponteiro aponta para NULL) muito importante para o tratamento de erros na abertura de <b><a href="http://www.cprogressivo.net/p/arquivos-em-c.html" target="_blank">arquivos em C</a></b>.</div>
<div>
<br /></div>
<div>
Este erro pode ocorrer por vários motivos. O mais óbvio é abrir um arquivo que não existe (geralmente ocorre quando escrevemos errado o endereço do arquivo).</div>
<div>
<br /></div>
<div>
Em sistemas operacionais mais seguros, como os Linux, o acesso aos arquivos (seja para leitura, escrita ou anexação) é geralmente limitado, não sendo possível acessar e alterar qualquer arquivo (como geralmente ocorre em sistemas mais vulneráveis, como o Windows).</div>
<div>
<br /></div>
<div>
Caso você tente alterar ou acessar um arquivo sem permissão, a função <i>fopen</i> também irá retornar NULL para o ponteiro.</div>
<div>
<br /></div>
<div>
<span style="color: red;">if(arquivo == NULL)</span></div>
<div>
<span style="color: red;"> printf("Nao foi possivel abrir o arquivo!");</span><br />
<span style="color: red;"><br /></span>
PS: agradecimento ao leitor <i>steniovm</i>, que ajudou na correção do artigo :D</div>
Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com12tag:blogger.com,1999:blog-6926985245178197542.post-6488478246736101092013-10-22T11:56:00.004-07:002018-11-23T09:24:25.586-08:00Arquivos (Files) em CNeste tutorial de nossa <a href="http://www.cprogressivo.net/" style="font-weight: bold;" target="_blank">apostila de C</a>, daremos início a uma importante seção de nosso curso, sobre os arquivos (<i>Files</i>), em linguagem C.<br />
<ul>
<li>Leia este tutorial no seu computador ou celular: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<a name='more'></a><ul>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank"></a><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Clique aqui e obtenha seu certificado de programador C</a></li>
</ul>
<h2>
<span style="font-size: x-large;">Dados temporários x Dados permanentes</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Se notar bem, até o momento, em nossa apostila, todos os nossos programas iniciavam sempre do mesmo jeito, em relação aos dados.</div>
<div>
<br /></div>
<div>
Quando abríamos, informávamos variáveis diversas, como números e strings.</div>
<div>
Eles executam comandos que programamos e, ao fecharem, essas informações eram todas perdidas em nossa máquina.</div>
<div>
E ao iniciá-los de novo, tudo voltava a rodar do zero.</div>
<div>
<br /></div>
<div>
Resumindo: nossos dados, variáveis e tudo mais, eram temporários.</div>
<div>
Basta desligar o programa, sistema operacional ou computador, que tudo que tínhamos feito iria embora.</div>
<div>
<br /></div>
<div>
Mas é assim normalmente?</div>
<div>
Quando você inicia seu sistema operacional, ele começa tudo do zero?</div>
<div>
Sem variáveis, sem informações?</div>
<div>
<br /></div>
<div>
Claro que não. Suas pastas estão lá, com seus arquivos de texto, música e imagens.</div>
<div>
Ou seja, o programas que rodam, de alguma maneira, fazem com que estas informações fiquem registradas em sua máquina de maneira permanente.</div>
<div>
<br /></div>
<div>
Imagine que você implementou uma <a href="http://www.cprogressivo.net/2013/10/Como-fazer-uma-lista-em-C.html" target="_blank">lista em C</a>, centenas de linhas de código, muitas ideias e algoritmos. Essa lista é usada em uma farmácia para armazenar os dados de todos os remédios, com seus nomes, indicações, contra-indicações, valores, unidades em estoque etc.</div>
<div>
<br /></div>
<div>
Ok, isso é perfeitamente possível de se criar, e o ensinamos com o uso da lista.</div>
<div>
Mas será que o dono do estabelecimento iria gostar de colocar todas as informações, sobre todos os medicamentos, sempre que ligasse o que computador?</div>
<div>
<br /></div>
<div>
Óbvio que não. Por isso, precisamos aprender não só como gravar informações de maneira permanente, mas também ler, alterar e apagá-las.</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">Arquivos em C - O que são e para que servem</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
<div>
Já reparou que, quando você vai jogar aquele game que você adora você põe seus dados, aí joga de boas, e quando vai abrir ele de novo vê que ele guardou seu nome, pontuação e situação do jogo que você estava? Já parou para pensar como isso ocorre?</div>
<div>
<br /></div>
<div>
A resposta é bem simples: eles armazenam essa informação em alguma local de seu computador, em arquivos. Assim, ao iniciar o programa de novo, o jogo simplesmente vai lendo essas informações para saber de onde começar, que dados exibir.</div>
<div>
<br /></div>
<div>
E é exatamente isso que vamos fazer ao estudar arquivos em C.</div>
<div>
Iremos aprender como interagir com o sistema, como:</div>
<div>
<br />
<ul>
<li>ler arquivos de textos</li>
<li>escrever em arquivos (ao invés de imprimir na tela, imprimir em arquivos)</li>
<li>apagar e substituir informações em arquivos</li>
<li>após rodar nosso aplicativo, salvar nossos valores</li>
<li>usar dados armazenados em arquivos para usar em nossos programas</li>
</ul>
</div>
<div>
<br /></div>
<div>
Poderemos, por exemplo, criar um jogo que pode salvar nossa pontuação para continuarmos depois.</div>
<div>
Assim é possível criar um jogo da Forca, ondas as palavras para serem adivinhadas ficam em arquivos de textos, sendo possível o usuário ir nesses arquivos e adicionar mais palavras para o jogo.</div>
<div>
<br /></div>
<div>
Enfim, é um mundo de novas e interessantes opções que teremos ao fazer uso de arquivos em nossos aplicativos em C.<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">Comandando um Sistema Operacional através do uso de Arquivos</span></h2>
<div>
Escrever, ler, apagar e editar arquivos é um assunto básico e essencial, que praticamente toda linguagem de programação permite. Porém, dependendo de seu sistema operacional, esse recurso pode ser pouco útil ou pode ser que lhe dê todo o poder do mundo.</div>
<div>
<br /></div>
<div>
Em sistemas operacionais derivados do Unix, como o Linux e os *BSD, praticamente tudo é feito usando arquivos de texto, como os .txt que você utiliza.<br />
<br /></div>
<div>
Quer adicionar um usuário? Pode adicionar através de arquivo de texto.</div>
<div>
Quer montar uma rede? Configure alguns textos.</div>
<div>
Quer baixar algum aplicativo ou fazer uma atualização? Use uns comandos no terminal, em texto.</div>
<div>
<br /></div>
<div>
Até para definir o brilho de sua tela, é possível fazer simplesmente alterando o conteúdo de arquivos de texto.<br />
E como dissemos, é possível alterar, ler, apagar e escrever em arquivos através da linguagem C.<br />
O que isso nos diz?<br />
<br />
Sim, sabendo programar e usando sistemas operacionais, como Linux, é possível revirar o sistema de ponta cabeça, fazendo o que você quiser.<br />
Por isso indicamos que use, pelo menos para experimentar, esse maravilhoso Sistema.<br />
<br />
Ao contrário do que muitos pensam, não é difícil, para instalar basta colocar um pendrive ou dvd de uma ISO, e está feito. É possível instalar e usar tudo no modo gráfico.<br />
<br />
É um sistema simplesmente perfeito para quem é envolvido com programação.<br />
O sistema já vem com diversos compiladores e IDE's, prontinho para você programar.<br />
<br />
Infelizmente tal liberdade não é, nem de longe, possível com sistemas fechados, como o Windows.<br />
Neste sistema, se quiser ajustar ou mudar algo na configuração, provavelmente terá que ir no Painel de Controle e executar algum aplicativo (binário), que obviamente é fechado, não sendo possível usar através de arquivos de texto, até porque não sabemos como é o funcionamento de tais programas.<br />
<br />
Mas independente de seus sistema, verá que usar arquivos em seus programas em C os fará bem mais flexíveis e úteis.</div>
Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com1tag:blogger.com,1999:blog-6926985245178197542.post-76358600741838981242013-10-12T20:58:00.001-07:002018-11-23T09:02:08.049-08:00Como fazer uma lista em C - Implementação completa (inserindo e retirando nós de qualquer posição)Dando continuidade em nossa seção sobre <a href="http://www.cprogressivo.net/2013/10/Estrutura-de-dados-dinamica-em-C-Listas-Filas-Pilhas-Arvores.html" target="_blank">estrutura dinâmica de dados</a> e ao tutorial passado sobre <a href="http://www.cprogressivo.net/2013/10/Listas-em-C-O-que-e-como-funciona-uma-LIST.html" target="_blank">Listas simplesmente encadeadas</a>, onde criamos e ensinamos a <a href="http://www.cprogressivo.net/2013/10/Lista-simplesmente-encadeada-com-cabeca-em-C-Inserindo-nos-no-inicio-e-fim.html" target="_blank">colocar nós ao fim e no início da lista</a>, e depois<a href="http://www.cprogressivo.net/2013/10/Lista-em-C-como-excluir-elementos-do-inicio-e-do-final.html" target="_blank"> como retirar nós do início e do fim de uma lista</a>, vamos agora mostrar como colocar elementos em qualquer ponto da lista, bem como tirar nós do início, do fim e de qualquer lugar da lista.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvrbjsAjQgbBdgsrM0LAjmxW3beyM4ifPGBMBvvvfIfQd0W6cvOxuiqP2Z5v7qXXTPB1jGR3kN6RNxAgmhCSL8_jtjJDuvbTFoHMiisw9AL11Dy5UHKxBdTRcrBnhz3S6SVsH-ClLjSv4/s1600/Como-criar-uma-lista-em-C.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Como programar uma lista completa em C" border="0" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvrbjsAjQgbBdgsrM0LAjmxW3beyM4ifPGBMBvvvfIfQd0W6cvOxuiqP2Z5v7qXXTPB1jGR3kN6RNxAgmhCSL8_jtjJDuvbTFoHMiisw9AL11Dy5UHKxBdTRcrBnhz3S6SVsH-ClLjSv4/s320/Como-criar-uma-lista-em-C.png" title="Lista encadeada em C" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="font-size: 13.333333969116211px;">Listas em C</td></tr>
</tbody></table>
<span style="font-size: x-large;"></span><br />
<ul>
<li>Leia este tutorial no seu computador ou celular: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<a name='more'></a><h2>
<span style="font-size: x-large;">Como criar uma lista completa em C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Este é o quarto artigo de nossa série sobre listas simplesmente encadeadas com cabeça.<br />
Aqui mostraremos como inserir e retirar qualquer nó de nossa lista, e com isso temos um código completo, totalmente explicado, passo-a-passo sobre como criar esse tipo de estrutura de dados em C.<br />
<br />
É o mais completo, com todo o código. Porém é necessário que você tenha lido os outros tutoriais de nossa <a href="http://www.cprogressivo.net/" target="_blank">apostila de C</a> para entender melhor o que será explicado aqui:<br />
<ul>
<li><a href="http://www.cprogressivo.net/2013/10/Listas-em-C-O-que-e-como-funciona-uma-LIST.html" target="_blank">O que é e como funciona uma lista</a></li>
</ul>
<ul>
<li><a href="http://www.cprogressivo.net/2013/10/Lista-simplesmente-encadeada-com-cabeca-em-C-Inserindo-nos-no-inicio-e-fim.html" target="_blank">Inserindo nós no início e no fim</a></li>
</ul>
<ul>
<li><a href="http://www.cprogressivo.net/2013/10/Lista-em-C-como-excluir-elementos-do-inicio-e-do-final.html" target="_blank">Retirando nós no início e no fim</a></li>
</ul>
<br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Como obter certificado de programador C</a><br />
<h2>
<span style="font-size: x-large;">Alterações em nossa lista</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Agora que você já deve ter se familiarizado com os conceitos e lógicas de tirar e inserir elementos em uma lista, vamos fazer algumas mudanças, deixar o programa mais robusto e flexível.<br />
<br />
Já no tutorial passado, na parte de inserir elementos, criamosa a função <i>aloca()</i>, que como o próprio nome diz, ela vai alocar espaço para uma estrutura, um nó em nossa lista.<br />
Ela pede para inserir o número, colocar na variável 'num' da struct e retorna o endereço <a href="http://www.cprogressivo.net/p/alocacao-dinamica-de-memoria-em-c.html" target="_blank">alocado dinamicamente</a>.<br />
<br />
Agora, criamos também a variável global <i style="font-weight: bold;">tam</i>, que irá armazenar o tamanho de nossa lista.<br />
Ou seja, quantos nós tem nossa lista. E para contabilizar isso, toda vez que criamos um nó, incrementamos essa variável.<br />
Analogamente, sempre que tiramos uma struct da lista, decrementamos a variável.<br />
<br />
Alteramos também a função exibe, que agora exibe a ordem dos elementos na lista.<br />
Conforme podemos ver na imagem no início deste tutorial.<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Como inserir nós em qualquer posição da lista</span></h2>
Vamos agora mostrar como criar a função <i>insere()</i> que recebe a LISTA e pergunta ao usuário em que posição o usuário quer inserir o elemento na lista. Ou seja, se queremos inserir na posição 'n', o elemento vai ficar nessa posição 'n' e o que estava lá antigamente vai para frente, para posição 'n+1'.<br />
O usuário vai dizer a posição e está sera armazenada na variável <b>pos</b>.<br />
<br />
Podemos inserir desde a posição 1 até a 'tam'.<br />
Obviamente, fora desse intervalo devemos mostrar uma mensagem de erro.<br />
Feita essa verificação da posição, vamos adicionar o elemento na dita posição.<br />
<br />
Caso seja posição 1, não devemos nos estressar.<br />
Afinal, inserir um elemento na posição 1 é inserir uma estrutura no início da lista, e já criamos uma função para isto, a <i style="font-weight: bold;">insereInicio()</i>, bastando chamar ela: insereInicio(LISTA);<br />
<br />
Caso seja em qualquer outra posição, a coisa fica mais trabalhosa.<br />
O segredo para isto é identificar dois elementos.o anterior e o elemento que está naquela posição.<br />
<br />
Por exemplo, se queremos colocar um nó na terceira posição, devemos guardar essa posição e a anterior, pois iremos fazer o segundo elemento apontar para o novo nó, e fazer esse novo nó apontar para aquele que estava na terceira posição.<br />
<br />
Para isso vamos usar dois ponteiros do tipo <i style="font-weight: bold;">node</i>, o tipo de nossa estrutura: o 'atual' e o 'anterior'.<br />
O atual começa no primeiro nó da LISTA, e o anterior não está em uma posição anterior (um aponta para LISTA->prox e o outro para LISTA).<br />
<br />
Agora temos que fazer estes dois pontos 'correrem' pela lista até chegar onde queremos.<br />
Vamos usar um laço for para isso, e em cada iteração fazemos o seguinte:<br />
Fazemos o ponteiro 'anterior' receber o ponteiro 'atual', e depois fazemos o 'atual' receber o próximo elemento da lista, que é o 'atual->prox'.<br />
<br />
Se queremos chegar na posição 4, por exemplo, devemos fazer esse procedimento 3 vezes, pois partimos da primeira posição da lista. Ou seja, fazemos isso <b>(pos - 1)</b> vezes, e ao final deste procedimento, o ponteiro 'atual' estará no elemento que mudará de posição (para frente), e o ponteiro 'anterior' apontará para a posição anterior:<br />
<pre><span style="color: maroon; font-weight: bold;">
</span></pre>
<pre><span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">1</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> pos <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
anterior<span style="color: #808030;">=</span>atual<span style="color: purple;">;</span>
atual<span style="color: #808030;">=</span>atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
E agora vamos inserir nosso nó, que criamos ao declarar o <a href="http://www.cprogressivo.net/p/aprenda-tudo-sobre-ponteiros-em-c.html" target="_blank">ponteiro</a> 'novo' e fazer ele receber um bloco alocado pela função aloca().<br />
Vamos lá, devagar pois não é tão simples.<br />
<br />
Temos dois nós: o 'atual' e o 'anterior'. Queremos colocar um novo nó, o 'novo', no lugar do nó 'atual' e empurrar o 'atual' pra frente.<br />
Para isso, devemos pegar o 'anterior' e fazer apontar para o 'novo': <span style="color: red;">anterior->prox = novo;</span><br />
E o novo nó deve apontar para o que estava nesse posição: <span style="color: red;">novo->prox = atual;</span><br />
E claro, incrementar o tamanho da lista: <span style="color: red;">tam++;</span><br />
<br />
Pronto. Já podemos colocar um nó no início, no fim ou em qualquer lugar de nossa lista :)<br />
Vamos para o próximo passo: retirar elementos de nossa lista.<br />
<br />
<h2>
<span style="font-size: x-large;">Como retirar estruturas de uma lista</span></h2>
Se já leu todos nossos tutoriais sobre listas em C, certamente já deve ter em mente como implementar um algoritmo que retire um elemento.<br />
<br />
Vamos usar exatamente a mesma ideia que usamos na parte passada do tutorial, para achar os elementos 'atual' (que vamos excluir) e o anterior a ele.<br />
Ou seja, aquele mesmo <a href="http://www.cprogressivo.net/2013/02/O-que-e-e-como-usar-o-laco-WHILE-em-C.html" target="_blank">laço while</a> será usado, da mesma maneira.<br />
<br />
Porém, não vamos precisar de um novo nó, afinal não vamos adicionar nada, e sim retirar a struct apontada pelo ponteiro 'atual'.<br />
E como vimos diversas, o ato de 'retirar' um nó de uma lista é simplesmente deixar de apontar algum elemento da lista para ele.<br />
<br />
Quem aponta para o elemento que queremos retirar é: <span style="color: red;">anterior->prox</span><br />
Qual elemento que vem após o elemento que vamos retirar: <span style="color: red;">atual->prox</span><br />
Elemento retirado, que devemos retornar da função: <span style="color: red;">atual</span><br />
<br />
Ou seja, para excluir, basta apontarmos o elemento anterior ao que queremos retirar, para aquele elemento que vem DEPOIS do que queremos retirar.<br />
Isso é feito da seguinte maneira: <span style="color: red;">anterior->prox = atual->prox</span><br />
<br />
E pronto. A lista continua ligada, mas sem o elemento 'atual', na qual retornamos, sem antes decrementar a variável<i style="font-weight: bold;"> tam</i>, já que retiramos uma estrutura da lista.<br />
<br />
<h2>
<span style="font-size: x-large;">Código completo de uma Lista em C</span></h2>
E finalmente, após muito estudo e trabalho, nosso código completo, de uma lista em C que nos permite inserir e retirar um nó (struct) de toda e qualquer posição.<br />
<br />
É uma lista flexível, onde há diversas maneiras de trabalhar com ela, além de exibir seus elementos de uma maneira esteticamente agradável e faz uso de pouca memória (além de liberar ela, ao final da aplicação), sendo robusta e muito e eficiente:<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">struct</span> Node<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> num<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">struct</span> Node <span style="color: #808030;">*</span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">typedef</span> <span style="color: maroon; font-weight: bold;">struct</span> Node node<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> tam<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>criaNo<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insereFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insereInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insere <span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>retiraInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>retiraFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>retira<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>LISTA <span style="color: #808030;">=</span> <span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
inicia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">do</span><span style="color: purple;">{</span>
opt<span style="color: #808030;">=</span>menu<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
opcao<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">,</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
tam<span style="color: #808030;">=</span><span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Escolha a opcao</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">0. Sair</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">1. Zerar lista</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">2. Exibir lista</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">3. Adicionar node no inicio</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">4. Adicionar node no final</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">5. Escolher onde inserir</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">6. Retirar do inicio</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">7. Retirar do fim</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">8. Escolher de onde tirar</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Opcao: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> opt<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">switch</span><span style="color: #808030;">(</span>op<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">0</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">1</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
inicia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">2</span><span style="color: #e34adc;">:</span>
exibe<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">3</span><span style="color: #e34adc;">:</span>
insereInicio<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">4</span><span style="color: #e34adc;">:</span>
insereFim<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">5</span><span style="color: #e34adc;">:</span>
insere<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">6</span><span style="color: #e34adc;">:</span>
tmp<span style="color: #808030;">=</span> retiraInicio<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Retirado: </span><span style="color: #0f69ff;">%3d</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">7</span><span style="color: #e34adc;">:</span>
tmp<span style="color: #808030;">=</span> retiraFim<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Retirado: </span><span style="color: #0f69ff;">%3d</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">8</span><span style="color: #e34adc;">:</span>
tmp<span style="color: #808030;">=</span> retira<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Retirado: </span><span style="color: #0f69ff;">%3d</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: #e34adc;"> </span><span style="color: maroon; font-weight: bold;">default</span><span style="color: #e34adc;">:</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Comando invalido</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> vazia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">1</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span><span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>novo<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Novo elemento: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insereFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">=</span>novo<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
tam<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insereInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>oldHead <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> oldHead<span style="color: purple;">;</span>
tam<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: #603000;">system</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">clear</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista vazia!</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista:</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> tmp <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;"> </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> tam <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;"> ^ </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;">Ordem:</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> tam <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> count<span style="color: #808030;">+</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>proxNode<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>atual<span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>atual <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
proxNode <span style="color: #808030;">=</span> atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>atual<span style="color: #808030;">)</span><span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> proxNode<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insere<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> pos<span style="color: #808030;">,</span>
count<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Em que posicao, [de 1 ate </span><span style="color: #0f69ff;">%d</span><span style="color: #0000e6;">] voce deseja inserir: </span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tam<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>pos<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>pos<span style="color: #808030;">></span><span style="color: #008c00;">0</span> <span style="color: #808030;">&</span><span style="color: #808030;">&</span> pos <span style="color: #808030;"><</span><span style="color: #808030;">=</span> tam<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>pos<span style="color: #808030;">=</span><span style="color: #808030;">=</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span>
insereInicio<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>atual <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>anterior<span style="color: #808030;">=</span>LISTA<span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">1</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> pos <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
anterior<span style="color: #808030;">=</span>atual<span style="color: purple;">;</span>
atual<span style="color: #808030;">=</span>atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
anterior<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">=</span>novo<span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> atual<span style="color: purple;">;</span>
tam<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Elemento invalido</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>retiraInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista ja esta vazia</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tam<span style="color: #808030;">-</span><span style="color: #808030;">-</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> tmp<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>retiraFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista ja vazia</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>ultimo <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>penultimo <span style="color: #808030;">=</span> LISTA<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
penultimo <span style="color: #808030;">=</span> ultimo<span style="color: purple;">;</span>
ultimo <span style="color: #808030;">=</span> ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
penultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
tam<span style="color: #808030;">-</span><span style="color: #808030;">-</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> ultimo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>retira<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: #808030;">,</span>
count<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Que posicao, [de 1 ate </span><span style="color: #0f69ff;">%d</span><span style="color: #0000e6;">] voce deseja retirar: </span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tam<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>opt<span style="color: #808030;">></span><span style="color: #008c00;">0</span> <span style="color: #808030;">&</span><span style="color: #808030;">&</span> opt <span style="color: #808030;"><</span><span style="color: #808030;">=</span> tam<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>opt<span style="color: #808030;">=</span><span style="color: #808030;">=</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> retiraInicio<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>atual <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>anterior<span style="color: #808030;">=</span>LISTA<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">1</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> opt <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
anterior<span style="color: #808030;">=</span>atual<span style="color: purple;">;</span>
atual<span style="color: #808030;">=</span>atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
anterior<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">=</span>atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tam<span style="color: #808030;">-</span><span style="color: #808030;">-</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> atual<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Elemento invalido</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span></pre>
Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com13tag:blogger.com,1999:blog-6926985245178197542.post-77808393015068153552013-10-12T18:37:00.000-07:002018-11-23T08:58:38.936-08:00Lista simplesmente encadeada com cabeça em C: Retirando nós no início e no fimComo já aprendemos a <a href="http://www.cprogressivo.net/2013/10/Lista-simplesmente-encadeada-com-cabeca-em-C-Inserindo-nos-no-inicio-e-fim.html" target="_blank">inserir elementos no início e no fim de uma lista</a>, nada mais justo que aprender como retirar nós do início e do fim de uma lista., que é o que iremos aprender neste tutorial de nossa <a href="http://www.cprogressivo.net/" target="_blank">apostila C Progressivo</a>.<br />
<br />
No próximo tutorial faremos uma generalização, mostrando como inserir e retirar elementos de qualquer posição da lista, e teremos uma lista completa e flexível.<br />
<a name='more'></a><ul>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Como obter certificação em C</a></li>
<li>Download do curso: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<br />
<h2>
<span style="font-size: x-large;">Retirando nós da uma lista em C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Agora vamos aprender como retirar estruturas de uma lista.<br />
Assim como fizemos para inserir, vamos aprender como retirar no início e no fim, que são mais simples e ajudará você a entender melhor.<br />
Depois, quando entender melhor esses conceitos, podemos fazer algo mais completo, que é retirar e inserir uma struct em qualquer posição.<br />
<br />
Uma diferença importante é que, quando inseríamos nós, nossas funções eram do tipo <i style="font-weight: bold;">void</i>, afinal, simplesmente tínhamos que colocar um nó ali na lista.<br />
<br />
Mas quando retiramos, é importante saber que elementos retiramos.<br />
A explicação disso é o bom senso: quando tiramos um elemento de uma lista, é para trabalhar em cima dele, ver seu conteúdo, passar ele para outra função ou extrair algum dado.<br />
<br />
Portanto, nossa funções de retirar elementos irão retornar o nó, serão do tipo:<br />
<pre>node <span style="color: #808030;">*</span>retiraInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>retiraFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span></pre>
<pre><span style="color: purple;">
</span></pre>
<h2>
<span style="font-size: x-large;">Retirando um nó do início da lista</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
A primeira coisa que devemos fazer para retirar um nó do início é saber se esse nó realmente existe, ou seja, se a lista não está vazia.<br />
<br />
Essa simples verificação é feita usando um <a href="http://www.cprogressivo.net/2013/01/O-testecondicional-IF-ELSE.html" target="_blank">teste condicional IF</a>: <span style="color: red;">if(LISTA->prox == NULL)</span><br />
E caso dê verdadeira, é porque ela está vazia e não há para ser retirado.<br />
Como devemos retornar algo, iremos fazer: <span style="color: red;">return NULL;</span><br />
Isso é necessário para mostrar que nada foi retirado da lista.<br />
<br />
Agora iremos fazer a retirada do primeiro elemento da lista através do uso de um ponteiro para o tipo <i style="font-weight: bold;">node</i>, o *tmp<br />
Vamos fazer ele apontar para primeiro elemento da lista: <span style="color: red;">tmp = LISTA->prox;</span><br />
<br />
Então o primeiro elemento da lista está apontado por 'tmp'.<br />
Agora vem a lógica da exclusão de um elemento.<br />
Antes, <span style="color: red;">LISTA->prox</span> aponta para o primeiro elemento, então para excluir esse primeiro elemento, basta fazer com que esse ponteiro aponte para o segundo elemento.<br />
E onde está o segundo elemento? Está em: <span style="color: red;">tmp->prox;</span><br />
<br />
Logo, para excluir o primeiro nó, fazemos: <span style="color: red;">LISTA->prox = tmp->prox</span><br />
E em seguida retornamos 'tmp', que ainda aponta para aquele nó que foi excluído.<br />
Vale ressaltar que, embora tenhamos tirado ele da lista (fazendo com que ninguém aponte para ele), memória foi alocada para esse nó, então ele ainda existe, e está sendo apontado por 'tmp'.<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Como excluir um elemento ao final da lista</span></h2>
Assim como fizemos para tirar uma struct do início, para tirar do fim primeiro temos que checar se a lista está vazia, que é análogo à maneira anteriormente mostrada.<br />
<br />
Se notar bem, para retirar um elemento do início da lista, usamos dois ponteiros: <span style="color: red;">LISTA->prox</span> e <span style="color: red;">tmp</span><br />
Para fazer isso no final da lista, também vamos usar dois ponteiros.<br />
Porém, não vamos poder usar o LISTA->prox pois este está apontado para o início da lista.<br />
<br />
Para resolver este problema, iremos usar dois ponteiros neste algoritmo: '<span style="color: red;">ultimo</span>' e '<span style="color: red;">penultimo</span>'<br />
Como os próprios nomes podem sugerir, o 'ultimo' aponta para último elemento da lista e o 'penultimo' para o penúltimo elemento da lista.<br />
<br />
Nosso objetivo é simples, fazer o ponteiro 'ultimo' chegar ao fim da lista e o 'penultimo' a penúltima posição. Chegando lá, simplesmente fazemos o ponteiro 'penultimo' apontar para NULL, caracterizando este elemento como o último da lista, e retornamos o ponteiro 'ultimo', que contém o elemento retirado.<br />
<br />
E como sabemos que um elemento é o último da lista?<br />
Simples, ele aponta para NULL. Então vamos fazer o ponteiro 'ultimo' ir percorrendo a lista até chegar num ponto onde 'ultimo->prox' aponta para NULL, e aí chegamos ao fim.<br />
<br />
Porém, antes do 'ultimo' avançar, devemos fazer com que o ponteiro 'penultimo' receba o valor de 'ultimo'. Colocando isso dentro de um <a href="http://www.cprogressivo.net/2013/02/O-que-e-e-como-usar-o-laco-WHILE-em-C.html" target="_blank">laço while</a>, obtemos o que queríamos da seguinte maneira:<br />
<br />
<pre><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
penultimo <span style="color: #808030;">=</span> ultimo<span style="color: purple;">;</span>
ultimo <span style="color: #808030;">=</span> ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
Agora vamos excluir o último da lista, fazendo o penúltimo elemento apontar para NULL, e retornar ele:<br />
<span style="color: red;">penultimo->prox = NULL;</span><br />
<span style="color: red;">return ultimo;</span><br />
<br />
<h2>
<span style="font-size: x-large;">Código C da uma Lista encadeada</span></h2>
Logo, o código de um programa em C que implementa uma lista, onde é possível adicionar ou retirar elementos tanto do início como do fim, é:<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">struct</span> Node<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> num<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">struct</span> Node <span style="color: #808030;">*</span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">typedef</span> <span style="color: maroon; font-weight: bold;">struct</span> Node node<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>criaNo<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insereFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insereInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>retiraInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>retiraFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>LISTA <span style="color: #808030;">=</span> <span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
inicia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">do</span><span style="color: purple;">{</span>
opt<span style="color: #808030;">=</span>menu<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
opcao<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">,</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Escolha a opcao</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">0. Sair</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">1. Zerar lista</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">2. Exibir lista</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">3. Adicionar node no inicio</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">4. Adicionar node no final</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">5. Retirar do inicio</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">6. Retirar do fim</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Opcao: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> opt<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">switch</span><span style="color: #808030;">(</span>op<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">0</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">1</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
inicia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">2</span><span style="color: #e34adc;">:</span>
exibe<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">3</span><span style="color: #e34adc;">:</span>
insereInicio<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">4</span><span style="color: #e34adc;">:</span>
insereFim<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">5</span><span style="color: #e34adc;">:</span>
tmp<span style="color: #808030;">=</span> retiraInicio<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Retirado: </span><span style="color: #0f69ff;">%3d</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">6</span><span style="color: #e34adc;">:</span>
tmp<span style="color: #808030;">=</span> retiraFim<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Retirado: </span><span style="color: #0f69ff;">%3d</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: #e34adc;"> </span><span style="color: maroon; font-weight: bold;">default</span><span style="color: #e34adc;">:</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Comando invalido</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> vazia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">1</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span><span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>novo<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Novo elemento: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insereFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">=</span>novo<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insereInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span>aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>oldHead <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> oldHead<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista vazia!</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> tmp <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>proxNode<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>atual<span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>atual <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
proxNode <span style="color: #808030;">=</span> atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>atual<span style="color: #808030;">)</span><span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> proxNode<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>retiraInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista ja esta vazia</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> tmp<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>retiraFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista ja vazia</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>ultimo <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>penultimo <span style="color: #808030;">=</span> LISTA<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
penultimo <span style="color: #808030;">=</span> ultimo<span style="color: purple;">;</span>
ultimo <span style="color: #808030;">=</span> ultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
penultimo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> ultimo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span></pre>
<br />
<h2>
<span style="font-size: x-large;">Exercício de C</span></h2>
No próximo tutorial de nosso curso de C, vamos ensinar como inserir e retirar elementos de qualquer posição de uma lista, finalizando complemente nossa implementação de uma lista em C.<br />
Tente fazer essas implementações, que serão explicadas no próximo tutorial de nosso <a href="http://www.cprogressivo.net/" target="_blank">curso de C</a>.<br />
<br />
<a href="http://www.cprogressivo.net/2013/10/Como-fazer-uma-lista-em-C.html" target="_blank">Como criar uma lista completa em C</a>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com2tag:blogger.com,1999:blog-6926985245178197542.post-76612418345589557182013-10-11T01:12:00.003-07:002018-11-23T08:54:17.151-08:00Lista simplesmente encadeada com cabeça em C: Inserindo nós no início e no fimAgora que já vimos como funciona uma lista em C, vamos aprender como implementar, como programar uma lista desde o início.<br />
<br />
Como há diversas maneiras de se fazer isso, pois há diversos tipos de listas, vamos fazer vários tipos de listas e, aos poucos, iremos mostrar as ideias que podemos utilizar para criar mais recursos para nossas listas.<br />
<ul>
<li>Baixe o conteúdo do site: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila de C</a></li>
</ul>
<a name='more'></a><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obtenha sua certificação de programação C para entrar no Mercado de Trabalho!</a><br />
<br />
<h2>
<span style="font-size: x-large;">Tipos de Listas em C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
No esquema que mostramos no tutorial passado de nossa <a href="http://www.cprogressivo.net/" target="_blank">apostila de C</a>, explicamos <a href="http://www.cprogressivo.net/2013/10/Listas-em-C-O-que-e-como-funciona-uma-LIST.html" target="_blank">como funciona uma lista</a>, como seria adicionar um elemento (nó) em seu início, no seu fim ou em qualquer posição da lista.<br />
<br />
Também vimos como retirar um elemento da lista, tanto do início, do fim como de uma posição intermediária.<br />
Só aí já iriam várias implementações destas ideias.<br />
<br />
E além destes recursos, há os vários tipos de listas.<br />
Vamos estudar as simplesmente encadeadas, ou seja, seus nós são structs que possuem só um ponteiro, que aponta sempre para o elemento seguinte da lista.<br />
<br />
Além deste tipo, que é o mais simples, há ainda as listas duplamente encadeadas, que possuem ponteiros para o próximo e para o nó anterior.<br />
Há também as listas circulares, onde o último elemento se liga ao primeiro, e por aí vai.<br />
<br />
<h2>
<span style="font-size: x-large;">Lista encadeada com cabeça</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Neste artigo iremos focar nas simplesmente encadeadas, e sobre como inserir nós no início e ao fim da lista.<br />
Embora sejam 'poucas' coisas, você verá que na verdade, na hora de implementar pela primeira vez, pode parecer algo bem difícil e confuso.<br />
<br />
Mas iremos progredir aos poucos. Depois iremos aprender como excluir os elementos do fim, do início, bem como inserir ou retirar de qualquer local da lista, e até mesmo buscar nós específicos.<br />
Mas sem pressa, por hora, vamos fazer o básico, que só isso já vai dar mais de 150 linhas de código.<br />
<br />
Podemos implementar uma lista simplesmente encada de duas maneiras: com cabeça e sem cabeça.<br />
Onde a cabeça de uma lista seria um nó, que foi declarado explicitamente no início do programa.<br />
Não usaremos, na verdade, o conteúdo deste nó, também chamado de célula ou cabeça, pois como veremos, ele não será relevante.<br />
Ele serve para sinalizar o início da lista, para sabermos que ela inicia ali, naquele endereço fixo de memória.<br />
<br />
Fazemos isso na primeira linha de nossa main():<br />
<span style="color: red;">node *LISTA = (node *) malloc(sizeof(node));</span><br />
<br />
Como explicamos no tutorial passado, esse 'node' é um tipo que definimos (typedef struct), uma estrutura que armazena um número inteiro e um ponteiro para o tipo 'node' (nó, em inglês).<br />
<br />
A lista, de fato, será colocada no ponteiro deste nó inicial (cabeça), que está em: LISTA->prox<br />
Como acabamos de criar a lista, esse ponteiro deverá apontar para NULL, para sinalizar que a lista está vazia.<br />
Vamos fazer isso através do método 'inicia()', que simplesmente faz: LISTA->prox = NULL;<br />
<br />
Criamos um método para isto, pois este simples ato faz nossa lista ser zerada, sendo possível ser preenchida de novo.<br />
<br />
Em seguida, invocamos o método menu(), que irá mostrar ao usuário uma série de opções e irá armazenar a opção escolhida, que será enviada ao método 'opcao()', que irá tratar a opção escolhida através de um <a href="http://www.cprogressivo.net/2013/02/O-teste-condicional-SWITCH-o-que-e-para-que-serve-e-como-usar-o-switch-em-C.html" target="_blank">teste condicional SWITCH</a>.<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Como inserir um nó no início da lista</span></h2>
Inserir nós no início da lista é bem simples de se fazer, pois temos um head node, ou seja, um nó cabeça, que nos indica onde está o início de nossa lista: <span style="color: red;">LISTA->prox</span><br />
<br />
Primeiro precisamos criar o nosso novo nó, o 'novo'.<br />
Agora devemos fazer dois passos: primeiros fazemos LISTA->prox apontar para nosso novo nó, depois fazemos nosso nó apontar para o próximo elemento da lista.<br />
<br />
Mas aqui temos um problema.<br />
Antes o 'LISTA->prox' apontava para um local de memória que tinha o próximo nó.<br />
Mas quando apontamos ele para o nó 'novo', perdemos essa referência.<br />
<br />
Vamos resolver isso criando um ponteiro para armazenar o local que está 'LISTA->prox' antes de inserirmos o novo nó.<br />
Vamos chamar de 'oldHead', pois era a cabeça antiga da lista:<br />
<span style="color: red;">node *oldHead = LISTA->prox;</span><br />
<br />
Então, agora apontamos a cabeça da lista para nosso novo nó: <span style="color: red;">LISTA->prox = novo;</span><br />
E apontamos nosso novo nó para o nó antigo: <span style="color: red;">novo->prox = oldHead;</span><br />
<br />
E pronto, inserimos uma estrutura no início da lista. Interessante, não?<br />
<br />
<h2>
<span style="font-size: x-large;">Como inserir um nó ao final da lista</span></h2>
Vamos agora inserir um nó ao final da lista.<br />
Antes de mais nada, devemos alocar memória para este nó e preencher o número que iremos armazenar nele, o que é facilmente feito através da <a href="http://www.cprogressivo.net/2013/04/Como-usar-a-funcao-malloc-para-alocar-memoria-em-linguagem-C.html" target="_blank">função malloc()</a>, conforme estudamos na seção de nosso curso de <a href="http://www.cprogressivo.net/p/alocacao-dinamica-de-memoria-em-c.html" target="_blank">Alocação Dinâmica de Memória</a>:<br />
<span style="color: red;">node *novo=(node *) malloc(sizeof(node));</span><br />
<br />
Lembrando sempre de checar se a memória foi alocada (caso não, devemos dar um exit() no programa, informando o erro).<br />
Agora devemos procurar o final da lista.<br />
<br />
Antes, devemos checar se ela está vazia, através do método vazia(), que simplesmente checa o elemento: <span style="color: red;">LISTA->prox</span><br />
Se este apontar para NULL, a lista está vazia, afinal, esse elemento é a cabeça da lista, aponta par ao início dela.<br />
Caso seja realmente vazia, vamos fazer com que a cabeça aponte para este novo nó que criamos, o 'novo':<br />
<span style="color: red;">LISTA->prox = novo;</span><br />
<br />
Agora, este nó será o último elemento da lista, então ele DEVE apontar para NULL:<br />
<span style="color: red;">novo->prox = NULL;</span><br />
<br />
E caso não seja uma lista vazia? Bem, devemos procurar o final da lista, que é um nó que aponta para NULL.<br />
Para isso, vamos declarar um ponteiro de nó:<br />
<span style="color: red;">node *tmp;</span><br />
<br />
A ideia é fazer esse ponteiro apontar para todos os elementos da lista e checar se ele é o último.<br />
Algo como "Hey, você é o último da lista? Não? Próximo! E você, é? Não? Ok, próximo..."<br />
<br />
Então posicionamos ele apontando para o início da lista, nossa cabeça: tmp = LISTA->prox<br />
Agora vamos percorrer todos os nós, e só vamos parar quando o nó apontar para NULL, ou seja, só vamos parar quando a seguinte comparação retornar valor lógico TRUE:<br />
<span style="color: red;">tmp->prox == NULL</span><br />
<br />
Se retornar falso, devemos avançar a lista, e isso é feito da seguinte maneira:<br />
<span style="color: red;">tmp = tmp->prox;</span><br />
<br />
Isso é feito com um <a href="http://www.cprogressivo.net/2013/02/O-que-e-e-como-usar-o-laco-WHILE-em-C.html" target="_blank">laço while</a>, que sai varrendo todos os nós e só para quando encontra o último:<br />
<span style="color: red;">while(tmp->prox != NULL)</span><br />
<span style="color: red;"> tmp = tmp->prox;</span><br />
<br />
Ou seja, nosso ponteiro agora aponta para o próximo elemento da lista.<br />
E quando achar o ponteiro que aponta para NULL? Aí colocamos aquele nó que criamos, o 'novo'.<br />
Ou seja, em vez do último nó apontar para NULL, vai apontar para novo:<br />
<span style="color: red;">tmp->prox = novo;</span><br />
<br />
E como, ao declarar o 'novo', fizemos ele apontar para NULL, identificamos ele como o último elemento da lista.<br />
Genial, não?<br />
<br />
<h2>
<span style="font-size: x-large;">Como exibir os elementos de uma lista</span></h2>
Bom, em nada adianta alocar os elementos no início ou fim da lista, se não pudermos ver essa lista crescendo diante de nossos olhos.<br />
Por isso vamos criar uma função que será responsável por exibir todos os elementos da lista, do início ao fim.<br />
<br />
E onde é o início da lista? Ué, no nó cabeça: <span style="color: red;">LISTA->prox</span><br />
E onde é o final? É em um nó que aponta para NULL.<br />
<br />
Mais uma vez precisamos criar um ponteiro que vai apontar para cada um dos elementos da lista, e depois imprimir o número armazenado na estrutura.<br />
<br />
Vamos chamar, novamente, esse nó temporário de 'tmp' e deve apontar, inicialmente para a cabeça da lista:<br />
<span style="color: red;">node *tmp = LISTA->prox;</span><br />
<br />
Agora vamos imprimir o primeiro elemento (caso exista, senão existir, dizemos que a lista está vazia).<br />
Estamos em um nó, então imprimimos ele e avançamos.<br />
Para imprimir, damos um print no inteiro: <span style="color: red;">tmp->num</span><br />
E para avançar na lista: <span style="color: red;">tmp = tmp->prox</span><br />
<br />
E quando devemos parar o avanço? Quando chegarmos ao fim da lista. E quando isso ocorre? Quando nosso ponteiro temporário apontar para NULL. Logo, isso é feito dentro de um laço while:<br />
<span style="color: red;">while( tmp != NULL)</span><br />
<br />
Pronto, membros da lista exibidos.<br />
<br />
<h2>
<span style="font-size: x-large;">Liberando a memória armazenada para uma lista</span></h2>
Como enfatizamos bem ao ensinar o <a href="http://www.cprogressivo.net/2013/10/Funcao-free-Como-liberar-memoria-e-evitar-vazamento.html" target="_blank">uso da função free() para liberar a memória</a>, sempre devemos devolver o que foi alocado para nosso sistema, sob risco de ocorrer vazamento de memória que podem atrapalhar e travar um computador.<br />
<br />
Na lista, as coisas são um pouco mais complexas, pois alocamos memória várias vezes!<br />
Portanto, devemos sair desalocando e liberando cada nó que alocamos!<br />
<br />
Bom, vamos lá, mais uma vez usar nosso ponteiro para nó (caso não seja uma lista vazia), apontar para cada estrutura da lista e dar um free() nela. Vamos chamar esse ponteiro para nó de 'atual'.<br />
Inicialmente aponta para a cabeça: <span style="color: red;">node *atual = LISTA->prox;</span><br />
Agora libera a memória: <span style="color: red;">free(atual);</span><br />
Indo para o próximo elemento: <span style="color: red;">atual = atual->prox;</span><br />
Ok?<br />
<br />
Não, isso está errado. Lembre-se que se liberamos o primeiro nó e junto com ele o seu ponteiro *prox.<br />
Ou seja, não temos mais o local do próximo nó. E agora, José?<br />
<br />
A solução é, antes de liberar um nó, salvar seu ponteiro que está apontando para o próximo nó.<br />
Vamos criar um ponteiro para nó para guardar essa informação, será o 'proxNode'.<br />
<br />
Vamos começar de novo, agora salvando o próximo nó antes de desalocá-lo.<br />
Recebe o primeiro nó: <span style="color: red;">atual = LISTA->prox;</span><br />
Guarda o endereço do próximo nó: <span style="color: red;">proxNode = atual->prox;</span><br />
Desaloca:<span style="color: red;"> free(atual);</span><br />
<br />
Pronto. Desalocamos o nó, e sabemos onde está o próximo (guardado no ponteiro 'proxNode').<br />
Agora esse nó será o próximo a ser desalocado, basta repetir o procedimento:<br />
Recebe o próximo nó: <span style="color: red;">atual = proxNode;</span><br />
Guarda o endereço do próximo nó: <span style="color: red;">proxNode = atual->prox;</span><br />
Desaloca: <span style="color: red;">free(atual);</span><br />
<br />
E assim sucessivamente. E quando isso deve parar? Quando chegar ao final.<br />
E onde é o final da lista? É no nó que aponta para NULL.<br />
<br />
Ou seja, vamos avançando na lista, e quando estivermos em um nó que é NULL, paramos, não tentamos desalocá-lo.<br />
Assim, só liberamos memória quando o nó atual não for NULL: while(atual != NULL), e dentro desse while vão aqueles procedimentos que falamos (guarda o endereço do próximo, desaloca e vai para o próximo).<br />
<br />
<h2>
<span style="font-size: x-large;">Código em C de uma lista encadeada</span></h2>
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">struct</span> Node<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> num<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">struct</span> Node <span style="color: #808030;">*</span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">typedef</span> <span style="color: maroon; font-weight: bold;">struct</span> Node node<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>criaNo<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insereFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> insereInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>LISTA <span style="color: #808030;">=</span> <span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
inicia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">do</span><span style="color: purple;">{</span>
opt<span style="color: #808030;">=</span>menu<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
opcao<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">,</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> inicia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opt<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Escolha a opcao</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">0. Sair</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">1. Exibir lista</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">2. Adicionar node no inicio</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">3. Adicionar node no final</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">4. Zerar lista</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Opcao: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>opt<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> opt<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> opcao<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> op<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">switch</span><span style="color: #808030;">(</span>op<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">0</span><span style="color: #e34adc;">:</span>
libera<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">1</span><span style="color: #e34adc;">:</span>
exibe<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">2</span><span style="color: #e34adc;">:</span>
insereInicio<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">3</span><span style="color: #e34adc;">:</span>
insereFim<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">4</span><span style="color: #e34adc;">:</span>
inicia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: #e34adc;"> </span><span style="color: maroon; font-weight: bold;">default</span><span style="color: #e34adc;">:</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Comando invalido</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> vazia<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">1</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insereFim<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span><span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>novo<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Novo elemento: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: #808030;">=</span>novo<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">else</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> insereInicio<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>novo<span style="color: #808030;">=</span><span style="color: #808030;">(</span>node <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span>node<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>novo<span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem memoria disponivel!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Novo elemento: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span> <span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
node <span style="color: #808030;">*</span>oldHead <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> novo<span style="color: purple;">;</span>
novo<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox <span style="color: #808030;">=</span> oldHead<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Lista vazia!</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: purple;">;</span>
<span style="color: purple;">}</span>
node <span style="color: #808030;">*</span>tmp<span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span> tmp <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%5d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
tmp <span style="color: #808030;">=</span> tmp<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> libera<span style="color: #808030;">(</span>node <span style="color: #808030;">*</span>LISTA<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span><span style="color: #808030;">!</span>vazia<span style="color: #808030;">(</span>LISTA<span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
node <span style="color: #808030;">*</span>proxNode<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>atual<span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> LISTA<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>atual <span style="color: #808030;">!</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span><span style="color: purple;">{</span>
proxNode <span style="color: #808030;">=</span> atual<span style="color: #808030;">-</span><span style="color: #808030;">></span>prox<span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>atual<span style="color: #808030;">)</span><span style="color: purple;">;</span>
atual <span style="color: #808030;">=</span> proxNode<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span></pre>
<br />
<br />
<h2>
<span style="font-size: x-large;">Considerações sobre listas em C</span></h2>
Sim, não é fácil.<br />
Ponteiros não são fáceis, alocação também não é, e obviamente se juntarmos os dois, vai dar algo que realmente não é simples. Porém, não é impossível.<br />
<br />
É perfeitamente natural não entender de primeira.<br />
Leia, releia, veja mais uma vez. Clareie a mente, depois volte a estudar de novo.<br />
Tente realmente entender cada passo, tente refazer. Pesquise na internet, leia o livro que indicamos.<br />
Vai levar um tempo até se habituar com essas ideias, mas acredite, acontece com todos.<br />
<br />
Essas ideias são EXTREMAMENTE poderosas!<br />
Note que estamos tratando de estruturas, e essas structs podem ser qualquer coisa.<br />
Podem guardar dados de funcionários de uma empresa, informações de aluno de uma escola ou cada uma pode ser a bula de um remédio de uma farmácia, no sistema.<br />
<br />
Se tivermos 10 funcionários, as listas alocam espaço somente para estes 10.<br />
Se forem 100 alunos, teremos espaço para exatos 100 alunos. E se a farmácia tiver mil tipos de remédios, só vamos usar mil espaços de struct. Nem mais, nem menos.<br />
Precisa guardar mais uma informação? Somente mais uma struct será usada.<br />
<br />
E como veremos no próximo tutorial, quando não precisarmos de mais um elemento da lista, liberaremos seu espaço de memória.<br />
Resumindo: é um algoritmo extremamente eficiente, consome o mínimo de memória possível, e acredite: esta ideia está sendo usada agora, em seu sistema operacional.<br />
<br />
Não desanime, continue estudando.<br />
<br />
<h2>
<span style="font-size: x-large;">Exercícios sobre listas</span></h2>
No próximo tutorial sobre listas de nossa apostila de C, iremos ensinar como retirar um elemento do início, um elemento do fim e um intermediário.<br />
Tente implementar estes recursos.<br />
<br />
Após tentar, estude aqui <a href="http://www.cprogressivo.net/2013/10/Lista-em-C-como-excluir-elementos-do-inicio-e-do-final.html" target="_blank">Como retirar estruturas do início e final de uma lista em C</a> .Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com17tag:blogger.com,1999:blog-6926985245178197542.post-56877466074852326472013-10-10T11:30:00.003-07:002018-11-23T08:45:30.160-08:00Listas em C - O que é e como funciona uma ListEstrutura de dados dinâmica realmente não é o assunto mais fácil da linguagem C, é realmente necessário estudar bastante para entender perfeitamente os conceitos e ideias por trás deste assunto.<br />
<br />
Visando clarear mais a mente de nossos estudantes, a <a href="http://www.cprogressivo.net/" target="_blank">apostila C Progressivo</a> vai explicar o conceito de lista apenas com figuras e explicações escritas, nada de código por hora.<br />
<br />
<a name='more'></a><ul>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obtenha sua certificação em C e entre no Mercado de Trabalho!</a></li>
<li>Leia este tutorial no seu computador ou celular: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<h2>
<span style="font-size: x-large;">Lista encadeada - O nó</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Vamos tentar explicar, sem pressa e com detalhes, cada uma das ideias e elementos necessários para se estudar e trabalhar com estruturas de dados dinâmicas.<br />
<br />
O objetivo deste tutorial de nossa apostila é que você entenda, na sua cabeça, como tudo funciona.<br />
E esta é uma dica valiosa: antes de programar e fazer seu aplicativo rodar, ele tem que rodar perfeitamente na sua cabeça. Ou seja: antes de começar, entenda e faça na mente.<br />
<br />
Vamos chamar cada struct, a partir de agora, de <b>nó</b>.<br />
<br />
Por exemplo, criamos uma struct com algumas variáveis e um ponteiro que aponta para o seu próprio tipo. Logo, quando criamos tal nó, é da seguinte forma:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixm3Cv00CZcn8V3Q8DY4djFegUy9oeYPHWEQE15TvE7A1MnoOU12aa-saZ4ZGHx7lNTSfl6RGGrrCshpTcyvecwuTiXZVv7FBNeH7jontg0Aq1-DQ-kvJ3lFQvBGwVvnuKevHg3mu-UbI/s1600/Listas-em-C-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Listas simplesmente encadeadas em C" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixm3Cv00CZcn8V3Q8DY4djFegUy9oeYPHWEQE15TvE7A1MnoOU12aa-saZ4ZGHx7lNTSfl6RGGrrCshpTcyvecwuTiXZVv7FBNeH7jontg0Aq1-DQ-kvJ3lFQvBGwVvnuKevHg3mu-UbI/s1600/Listas-em-C-1.png" title="Nò de uma lista" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Pronto. Esse nó está em algum ponto da memória, e seu ponteiro aponta para um endereço de memória qualquer.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Agora vamos declarar outro nó, o <i>Elemento 2</i><b><i>.</i> </b>Seu funcionamento e criação (<a href="http://www.cprogressivo.net/p/alocacao-dinamica-de-memoria-em-c.html" target="_blank">alocando memória de maneira dinâmica</a>) são idênticos ao <i>Elemento 1</i>, e essa estrutura, ou nó, está em um lugar qualquer da memória, bem como seu ponteiro aponta para um local aleatório, chamado de lixo.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Veja:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0xWxlRW0g-StHk60X3ZEeakw5cDGetpYEZDmQUOt_fgAdonxBGyUepmH-fV6CgsYHDkvGhyphenhyphenN9mbxHJ6_0eYSFIJ4bZ4iDGGGd8eldqyzgymPzKehHbFSEX-GeJDRmD8sMM9TPRDrFE78/s1600/Listas-em-C-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Dois nós declarados" border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0xWxlRW0g-StHk60X3ZEeakw5cDGetpYEZDmQUOt_fgAdonxBGyUepmH-fV6CgsYHDkvGhyphenhyphenN9mbxHJ6_0eYSFIJ4bZ4iDGGGd8eldqyzgymPzKehHbFSEX-GeJDRmD8sMM9TPRDrFE78/s320/Listas-em-C-2.png" title="Dois nós desligados" width="301" /></a></div>
<div class="separator" style="clear: both;">
</div>
<h2>
<span style="font-size: x-large;">Conectando os nós de uma lista</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Agora temos que 'ligar', 'conectar' ou 'encadear' esses dois nós.<br />
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Lembre-se que o ponteiro é para o tipo do nó, então podemos fazer com que o ponteiro do primeiro nó aponte para o segundo nó! E como o nó foi alocado de maneira dinâmica, ele também é representado por um endereço de memória, que será usado pelo ponteiro do elemento 1.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
No nó 1, fazemos:</div>
<div class="separator" style="clear: both;">
ptr = Elemento2;</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Porém, o ponteiro do segundo nó ainda aponta para outro endereço de memória (lixo).</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Para podermos identificar que esse elemento é o último da lista, vamos fazer com que o ponteiro do nó 2 aponte para NULL, veja como ficou nossa lista encadeada:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY0L4CURCaBZM6neRAu8EWLFT79SLkYQ_HMSRyP-f5x9novCfs-B67iGh0R788NmdKMgXFdzkpzozChkx0tPw7nisfd8I5Zi1N6zDI3BrWxiCcx9jYr-M9GvIyFVUUYLh_8qIRTmtc4w4/s1600/Listas-em-C-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Apostila de C para download" border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY0L4CURCaBZM6neRAu8EWLFT79SLkYQ_HMSRyP-f5x9novCfs-B67iGh0R788NmdKMgXFdzkpzozChkx0tPw7nisfd8I5Zi1N6zDI3BrWxiCcx9jYr-M9GvIyFVUUYLh_8qIRTmtc4w4/s320/Listas-em-C-3.png" title="Conectando o nó 1 ao nó 2" width="320" /></a></div>
Pronto! Temos uma lista simples, com duas estruturas conectadas.<br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">Inserindo nó ao final da lista</span></h2>
Vamos colocar outro nó na lista?<br />
<br />
Primeiro declaramos o elemento 3.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPErtQyYdodx0T8en3oZsrEyjX71n2rF3NxiMskgwzr5o-7On6oglf60NdRGEJAAsPvQ9oQqzloLIyCcrQU6YCfDzJDyhF4mM6ocP1v7xwQWe0wjMm-_8oEiY8jRpZWU1u_83tIIkNUI8/s1600/Listas-em-C-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Apostila de linguagem C para download" border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPErtQyYdodx0T8en3oZsrEyjX71n2rF3NxiMskgwzr5o-7On6oglf60NdRGEJAAsPvQ9oQqzloLIyCcrQU6YCfDzJDyhF4mM6ocP1v7xwQWe0wjMm-_8oEiY8jRpZWU1u_83tIIkNUI8/s400/Listas-em-C-4.png" title="Adicionando mais um nó na List" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Como queremos que ele fique depois do elemento 2, fazemos com que o ponteiro deste segundo elemento aponte para o nó 3. E para identificar o nó 3 como o último da lista, fazemos seu ponteiro apontar para NULL. Veja:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQYETUBemeaRN3_dhGIxxL3Aigs_GrXHx0oU_rlz0lzEofi3_iOY7_19XIsj_un_AvawiOGDxNxPraReoviLkuOg42w7NFu5lX0uzJpAqKFmvv-H3vODzRopI9-1tyLNOKd4GlOo6awPo/s1600/Listas-em-C-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Apostila complete grátis" border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQYETUBemeaRN3_dhGIxxL3Aigs_GrXHx0oU_rlz0lzEofi3_iOY7_19XIsj_un_AvawiOGDxNxPraReoviLkuOg42w7NFu5lX0uzJpAqKFmvv-H3vODzRopI9-1tyLNOKd4GlOo6awPo/s320/Listas-em-C-5.png" title="3 nós em uma lista encadeada" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Simples, não? Agora raciocine como seria para colocar um quarto nó ao final da lista.<br />
O que você faria? Quem apontaria para quem? E qual ponteiro vai apontar para NULL agora?<br />
<br />
<h2>
<span style="font-size: x-large;">Conectando nós no início da lista</span></h2>
Nos exemplos acima, conectamos nós ao final da lista.<br />
Basicamente fazemos com que o nó antigo, que era o último, aponte para o novo nó, e o ponteiro desse novo nó aponte para NULL: é o nosso algoritmo para inserir um nó ao fim da lista.<br />
<br />
Agora iremos aprender como inserir o nó no COMEÇO da lista, na primeira posição!<br />
Como antes, primeiro declaramos um novo nó, o <i>Elemento 4</i>.<br />
Ele está em algum lugar na memória, perdido e solitário, assim como o seu ponteiro.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2PKuFxc24CleqoI-_ZUj8s0JoOeqN452mtdeX6e4IkmrZk67r6-ywTr6S0NTQ8R0uKdASDxyuU1qIIw34Q-w6ebB5fpFA8aVFSXQCMqNRb0iIu0fegsFy3aL8q2vcZnoDWxIqGu17GBQ/s1600/Listas-em-C-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Apostila online gratuita para download de C" border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2PKuFxc24CleqoI-_ZUj8s0JoOeqN452mtdeX6e4IkmrZk67r6-ywTr6S0NTQ8R0uKdASDxyuU1qIIw34Q-w6ebB5fpFA8aVFSXQCMqNRb0iIu0fegsFy3aL8q2vcZnoDWxIqGu17GBQ/s400/Listas-em-C-6.png" title="Adicionando mais nodes na List" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br class="Apple-interchange-newline" />
Precisamos, agora, conectar esse novo nó na lista.<br />
Porém, ninguém vai apontar para ele desta vez. Agora é ele que vai apontar para o primeiro nó da lista, que é sempre chamado de <b>head</b> (ou <b>cabeça</b>, em português).<br />
<br />
Ou seja, no ponteiro do novo nó, fazemos:<br />
ptr = Elemento1 ou ptr=cabeca<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-oEWz17wPNMHjF4JZ4BW8ieC83h7p8uH_Gq7k5reqb-lfbDkYDitp2oChnHeyotzvAS_gmksIruvOS9zsklDOnk7emFu1gjVB6AkzZ_8_H_QFbym4WKAAL402yrQ4hDAiCuCcodXkr0/s1600/Listas-em-C-7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Curso de C" border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-oEWz17wPNMHjF4JZ4BW8ieC83h7p8uH_Gq7k5reqb-lfbDkYDitp2oChnHeyotzvAS_gmksIruvOS9zsklDOnk7emFu1gjVB6AkzZ_8_H_QFbym4WKAAL402yrQ4hDAiCuCcodXkr0/s400/Listas-em-C-7.png" title="Como adicionar um nó no início da lista" width="400" /></a></div>
<div class="" style="clear: both; text-align: left;">
E pronto! Adicionamos o nó 4 no início da lista. Simples e óbvio, não?</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<h2>
<span style="font-size: x-large;">Inserindo um nó no meio da lista</span></h2>
<div class="" style="clear: both; text-align: left;">
Vimos que para adicionar um nó no início da lista, basta o novo primeiro nó apontar para o antigo primeiro nó. Já para colocar ao fim da lista, simplesmente apontávamos o ponteiro do último nó para o novo nó.</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
E para adicionar no meio da lista? Fazemos as duas coisas.</div>
<div class="" style="clear: both; text-align: left;">
Por exemplo, para colocar o nó na segunda posição: primeiro declaramos o nó 4, que está em um lugar qualquer da memória.</div>
<div class="" style="clear: both; text-align: left;">
Agora fazemos com que o primeiro ponteiro deixe apontar para o nó 2 e aponte para o novo nó, o nó 4.</div>
<div class="" style="clear: both; text-align: left;">
E agora fazemos com que o nó 4 aponte para o nó 2.</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHUzMvmOgVDD-X2rAZaxg5-bUL9Qa1qAvnpO4iN4tbsU3APdUdQYy2pQL5gVwAHuJGZ260Ftv6nTcWF0daZMP4R2P_W7gaf1NrZs9TRzl_T-JTbMq769YVrWE-Nw_1s3y8XCpOwgdGT40/s1600/Listas-em-C-10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="Tutorial de C completo" border="0" height="261" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHUzMvmOgVDD-X2rAZaxg5-bUL9Qa1qAvnpO4iN4tbsU3APdUdQYy2pQL5gVwAHuJGZ260Ftv6nTcWF0daZMP4R2P_W7gaf1NrZs9TRzl_T-JTbMq769YVrWE-Nw_1s3y8XCpOwgdGT40/s320/Listas-em-C-10.png" title="Como inserir um nó no meio da lista" width="320" /></a></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<h2>
<span style="font-size: x-large;">Excluindo um nó da lista</span></h2>
<div class="" style="clear: both; text-align: left;">
Para excluir um nó de uma lista, devemos fazer com que esse nó não aponte para ninguém e que ninguém da lista aponte para ele. Ou seja, ele não pode se relacionar com nenhum nó, deve se isolar.</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
No exemplo anterior, se quisermos tirar o nó 2, é só fazermos os passos contrários.</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpU485nU7sQAaD9IA1L2mSmU3UgpocqB1qidmkvVRwGHG9ge9I9W_DMPK_pD9uGLmEMn26qKzOzofatuLNisDlkWNAQKAa7ksy7fXkFq_gJU1FtCALrfc-B3z8uAFSHO3yYp4OwqGyYjk/s1600/Listas-em-C-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Como programar em C" border="0" height="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpU485nU7sQAaD9IA1L2mSmU3UgpocqB1qidmkvVRwGHG9ge9I9W_DMPK_pD9uGLmEMn26qKzOzofatuLNisDlkWNAQKAa7ksy7fXkFq_gJU1FtCALrfc-B3z8uAFSHO3yYp4OwqGyYjk/s400/Listas-em-C-8.png" title="Excluir nodes da List" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
O nó 4 apontava para o 2. Vamos cortar essa relação: agora o nó 4 não vai mais apontar par ao nó 2, e sim para o nó 3. Podemos ainda fazer com que o nó 2 que apontava para o nó 3, aponte para outro lugar.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Pronto. Ninguém aponta para o nó 2, e ele não aponta para ninguém.</div>
<div class="separator" style="clear: both; text-align: left;">
O nó 1 aponta para o 4, que aponta para o 3, que aponta para NULL. Cadê o nó 2? Não faz mais parte, vai ficar lá perdido na memória, pois não vai se relacionar com ninguém da lista.</div>
<div class="" style="clear: both;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1-zzffO7ICFWSZSz7Xa6L6Xa3KzcfrepbYK9H9p3V7E3fdADUEYft6kPr-3z4CB8Pf1fMsSGc0eOBT4-4eF61_45XVhtw4L7nAo3tnjIsC0RBb5HbFW_kOaEb4prEejkgIFfYQYLvulQ/s1600/Listas-em-C-9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Como ser programador C" border="0" height="261" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1-zzffO7ICFWSZSz7Xa6L6Xa3KzcfrepbYK9H9p3V7E3fdADUEYft6kPr-3z4CB8Pf1fMsSGc0eOBT4-4eF61_45XVhtw4L7nAo3tnjIsC0RBb5HbFW_kOaEb4prEejkgIFfYQYLvulQ/s320/Listas-em-C-9.png" title="Excluindo um node do meio da List" width="320" /></a></div>
<br />
E para excluir o primeiro nó?<br />
Ora, o nó 1 só faz apontar para o nó 2. Se fizermos ele apontar para NULL, ele sai da lista, já que ele é o primeiro e ninguém aponta para ele.<br />
<br />
E para excluir o último nó ?<br />
Basta fazer com que o penúltimo nó, que apontava para o último, deixe de apontar para ele e aponte para NULL. Pronto, agora ninguém aponta pro último e ele ficou apontando para NULL, logo, não tem mais nenhuma relação com a lista encadeada.<br />
<br />
Simples, bonitinho, com desenhos e tudo fazendo sentido.<br />
Se não entender, leia, releia até entender. Só podemos ir para o próximo passo depois de entendido perfeitamente este tutorial de nosso curso.<br />
<br />
Caso tenha entendido, é hora de partir para os códigos em C.<br />
No próximo tutorial vamos ensinar como programar uma lista encadeada em C. Até lá.Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com9tag:blogger.com,1999:blog-6926985245178197542.post-21522758490359866862013-10-09T07:49:00.001-07:002018-11-23T09:47:04.742-08:00Estrutura de dados dinâmicas em C - Listas, Filas, Pilhas e ÁrvoresAtravés desse artigo de nossa <a href="http://www.cprogressivo.net/" target="_blank">apostila de C</a>, iniciamos um dos mais importantes estudos em linguagem C, onde iremos aprender os conceitos de Listas, Filas, Pilhas e Árvores.<br />
<br />
São elementos das estruturas dinâmicas de dados e são essenciais na linguagem C e no estudo da computação, de um modo geral.<br />
Aprendendo estrutura de dados dinâmica, iremos nos aproximar do conhecimento que é realmente empregado nos mais diversos aplicativos e sistemas existentes.<br />
<br />
<a name='more'></a><ul>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Obter certificado de programação C</a></li>
<li>Leia este tutorial no seu computador ou celular: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<h2>
<span style="font-size: x-large;">O que é Estrutura Dinâmica de Dados em Linguagem C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Aqui em nossa apostila de C, já estudamos estrutura de dados quando aprendemos sobre vetores, que foi uma maneira de manipular várias informações (variáveis ou estruturas) de uma vez só, pois poderíamos declarar vários desses elementos.<br />
Quando isso era feito, esses dados estavam em uma sequência rigidamente definida na memória, bem como o número de elementos eram constantes. Esses dois detalhes, na verdade, possuem algumas limitações.<br />
<br />
Ou seja, estamos um trecho do título deste tutorial, a parte de "Estrutura de Dados".<br />
Também estudamos a outra parte, que se refere ao dinamismo. Vimos isso em nossa seção de Alocação dinâmica de memória, onde deixamos de estar presos ao conceito de "número de elementos fixos", pois lá alocávamos e realocávamos o tanto de espaços de memória que queríamos, da maneira que queríamos.<br />
<br />
Pois bem, agora é hora de 'unir forças' e usar esses poderosos conceitos para criar outro importante conceito, o de estrutura de dados dinâmicas, ou seja, as estrutura de dados que são alocadas, realocadas e movidas o quanto e do jeito que quisermos.<br />
<br />
Ou seja, ao contrário de vetores de tamanhos fixos, iremos basicamente colocar estruturas(structs) em uma sequência que será criada dinamicamente, da maneira que quisermos. Ou seja, podemos colocar elementos nessa sequência, tirar, mudar de lugar, percorrer e fazer coisas incríveis.<br />
<br />
Mas só falando dessa maneira, a coisa fica um pouco confusa e abstrata.<br />
Vamos entrar em detalhes nos tipos de estrutura de dados que iremos estudar: Listas, Filas, Pilhas e Árvores.<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<br />
<h2>
<span style="font-size: x-large;">O que é uma Lista em C (Lists)</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Esqueça a programação. Use seu bom senso e responda: o que é uma lista?<br />
Vamos supor que você fez uma lista de compras.<br />
Ou seja, tem um pedaço de papel com diversos elementos, em uma dada ordem.<br />
Provavelmente essa ordem é a que você vai comprar, do primeiro para o último. Geralmente elas tem uma sequência lógica, como elementos do mesmo setores estarem adjacentes.<br />
Depois você vai trabalhar com essa lista, seguir a ordem dela, marcar se comprou ou não, anotar o preço etc.<br />
<br />
A analogia é parecida para uma lista em C.<br />
Em programação, lista é uma série de elementos ligados. O primeiro é ligado no segundo, que é ligado no terceiro etc.<br />
Iremos aprender como colocar elementos, tirar, mudar de posição. Como elas estão ligadas, basta que tenhamos o endereço (ponteiro) para o primeiro elemento da lista.<br />
<br />
Ou seja, iremos estudar as chamadas listas encadeadas, que são itens 'alinhados' numa fila.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0v560eIN3IqkdZIUWVKgWh8EyChe0XreIsAA-e1qolEwqVDZhxgMm-zA_FfsVxnK4_JSjrAkz_THgNw86g0SxgtPfBbkGJCoQymwNsDg_cnGf3fruqEm4EUNNj4DR-gvnjWbNUdx0rKM/s1600/Listas-encadeadas-linked-list.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Estrutura de dados dinâmica do tipo Lista (List) - Linked List" border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0v560eIN3IqkdZIUWVKgWh8EyChe0XreIsAA-e1qolEwqVDZhxgMm-zA_FfsVxnK4_JSjrAkz_THgNw86g0SxgtPfBbkGJCoQymwNsDg_cnGf3fruqEm4EUNNj4DR-gvnjWbNUdx0rKM/s400/Listas-encadeadas-linked-list.png" title="Listas Encadeadas" width="400" /></a></div>
<br />
<h2>
<span style="font-size: x-large;">Filas em C (Queue)</span></h2>
Outro importante conceito de estrutura de dados dinâmica são as filas, que são exatamente iguais as do mundo real.<br />
Como funciona a fila de um caixa eletrônico?<br />
<br />
Chega a primeira pessoa, é atendida. Já a segunda, fica na fila, e será atendida depois da primeira.<br />
A terceira a chegar só vai ser atendida depois da segunda, e assim sucessivamente.<br />
<br />
Ou seja, os primeiros elementos a chegar serão os primeiros a serem atendidos.<br />
Um termo muito conhecido para designar tal tipo de ideia é FIFO - First In, First Out (Primeiro que entra, primeiro que sai).<br />
<br />
Em termos de programação, dizemos que os elementos que chegam vão para a cauda da fila, ou seja, para o final, serão atendidos por último. Os elementos que serão primeiro atendidos são os que estão na cabeça da fila (na frente).<br />
Também chamamos o ato de colocar algo na fila de ENQUEUE, e de tirar de DEQUEUE.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGflaHA-B9xFGgYn2RLVZkkAhfn7ehpihrBpdeC4o9ESotSPr-9r6YZ0UMtfV54osdio2va1zLHW4_oamxhMBng3S_cP86cH255sjlXrEEiyj795ja3CHP15NqEcFdJjbC6eXsK5dENqM/s1600/Filas-Queue-em-Linguagem-C.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Estrutura de dados dinâmica do tipo Fila (Queue)" border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGflaHA-B9xFGgYn2RLVZkkAhfn7ehpihrBpdeC4o9ESotSPr-9r6YZ0UMtfV54osdio2va1zLHW4_oamxhMBng3S_cP86cH255sjlXrEEiyj795ja3CHP15NqEcFdJjbC6eXsK5dENqM/s400/Filas-Queue-em-Linguagem-C.jpg" title="Filas (Queue)" width="400" /></a></div>
<br />
<br />
<h2>
<span style="font-size: x-large;">Pilhas em C (Stack)</span></h2>
Outra importante estrutura dinâmica de dados são as pilhas (stacks, em inglês), que tem um funcionamento contrário ao das filas. São ditas do tipo LIFO - Last In, First Out (Ultimo a entrar, primeiro a sair).<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPX4oxZUGHm9vEGfhYX6CwacRuLMLWHDRcLuuxupXOV1UqdGipa2IjoU4ZO6wwAsv7r7jSYUQ039xvBP3jYQi5oRwnucSBqOqLFoB2Lt0kRF39nGM-XG8SRcxityCQWzfO7iKprKSJj-A/s1600/Pilha-stack.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="Estrutura de dados dinâmica do tipo Pilha (Stack)" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPX4oxZUGHm9vEGfhYX6CwacRuLMLWHDRcLuuxupXOV1UqdGipa2IjoU4ZO6wwAsv7r7jSYUQ039xvBP3jYQi5oRwnucSBqOqLFoB2Lt0kRF39nGM-XG8SRcxityCQWzfO7iKprKSJj-A/s1600/Pilha-stack.jpg" title="Pilhas em C" /></a>Para entender esse tipo de estrutura, podemos imaginar uma pilha de pratos.<br />
Você come uma coisa, e guarda o prato.<br />
Come a segunda coisa, e põe o segundo prato em cima do primeiro.<br />
Come a terceira e põe este prato em cima do segundo, e assim sucessivamente.<br />
<br />
Quando você for lavar, que prato vai retirar primeiro? O de cima.<br />
E qual o último prato a ser retirado? O primeiro.<br />
Ou seja, você vai tirando os pratos de cima, que são os pratos que chegaram por último na pilha.<br />
Já os pratos que chegaram primeiro na fila serão os últimos a saírem dela.<br />
<br />
Dois termos comum nesse tipo de ordenação de estruturas são PUSH e POP.<br />
PUSH é colocar um elemento na pilha, e POP é tirar.<br />
<br />
<h2>
<span style="font-size: x-large;">Árvores em C (Tree)</span></h2>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAaHNATfzv3iPUe8XAyhOp4wTDuuUJ8AX7cjk94op1b4w4KC4Roa5B7Z-Xv7UUq7PIdqTcMeTwwwdQAcff8cgnx2ISaeKLYcIA3GHGtulFfpA1o2j7LrnyCMXTGpeHhHasI-cOOle71kk/s1600/Arvores-binarias-binary-trees.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="Estrutura de dados dinâmica do tipo Árvore (Tree)" border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAaHNATfzv3iPUe8XAyhOp4wTDuuUJ8AX7cjk94op1b4w4KC4Roa5B7Z-Xv7UUq7PIdqTcMeTwwwdQAcff8cgnx2ISaeKLYcIA3GHGtulFfpA1o2j7LrnyCMXTGpeHhHasI-cOOle71kk/s320/Arvores-binarias-binary-trees.png" title="Árvore binária" width="320" /></a>Os elementos anteriores geralmente apontam para um elemento (o próximo).<br />
Existem listas duplamente encadeadas, que cada elemento está ligado com o anterior e o próximo, mas todas elas são lineares, formam uma sequência única.<br />
<br />
Já as árvores não, pois cada elemento pode estar ligado em um ou mais elemento, formando assim uma sub-árvore, e cada uma destas pode formar outras. Ou seja, há uma infinidade de caminhos e possibilidades para estruturas desse tipo.<br />
<br />
Daremos atenção especial para as árvores binárias, que possuem no máximo duas ramificações.<br />
<br />
<h2>
<span style="font-size: x-large;">Conceitos básicos de uma estrutura dinâmica de dados</span></h2>
Antes de começarmos a estudar separadamente cada estrutura que foi introduzida neste tutorial, vamos ver um esqueleto, uma estrutura básica que iremos usar em todos os itens aqui abordados.<br />
<br />
Primeiro de tudo, iremos realmente usar estruturas, ou seja, structs.<br />
Isso porque são elementos bem gerais, que nos permitem criar qualquer tipo de dado, da maneira que quisermos.<br />
<br />
A segunda ideia essencial para esse estudo, é a chamada auto-referência.<br />
Ou seja, vamos criar uma struct de um determinado tipo, e dentro dela iremos declarar um membro que é um ponteiro.<br />
Como sabemos, os ponteiros apontam para tipos diferentes de dados, e nesse caso, o ponteiro que fica dentro de uma struct irá apontar para um tipo dessa mesma struct.<br />
<br />
Isso se chama auto-referência. Pode ser um pouco estranho, mas é perfeitamente possível e uma ideia bastante usada.<br />
Lembre-se: quando criamos uma struct, ela terá um tamanho (sizeof()) definido. Portanto, ela será um tipo de dado.<br />
Então, é possível existir um ponteiro para este tipo de dado.<br />
Em suma: é uma estrutura que possui um ponteiro.<br />
<br />
Geralmente chamamos de nó (ou node, do inglês) os elementos de uma estrutura de dados dinâmica.<br />
Veja como seria nossa struct:<br />
<br />
<pre><span style="color: maroon; font-weight: bold;">struct</span> node
<span style="color: purple;">{</span>
<span style="color: dimgrey;">//dados e variáveis de sua struct aqui</span>
<span style="color: maroon; font-weight: bold;">struct</span> node <span style="color: #808030;">*</span>nextNode<span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
Esse ponteiro será de uso essencial, como veremos em breve em nossa apostila, pois eles irão apontar para o próximo elemento (próximo nó) ou para NULL, caso seja o último elemento da estrutura de dados.<br />
É importante não se esquecer isso, é a terceira característica básica de todos esses tipos de estrutura de dados, pois é um erro bem comum entre iniciantes: o ponteiro sempre aponta para uma região de memória, aqui iremos fazer ele apontar para o próximo elemento da lista, pilha, fila ou árvore.<br />
<br />
Quando criamos uma struct, seu ponteiro automaticamente vai apontar para o lixo, que é um endereço de memória como é endereço de memória caso apontemos esse ponteiro para outra struct, não há diferença.<br />
Por isso é importante apontarmos o último elemento para NULL, pois diferente dos outros, só ele aponta para esse local, daí podemos usar essa informação para saber quando nossa estrutura de dados termina :)<br />
<br />
Por hora, não se assuste. Iremos explicar, em detalhes, com muitos exemplos, cada um destes tipos, bem como faremos diversos algoritmos. Lembrando que é um assunto de suma importância, pois são ideias largamente usadas em programação.<br />
Seu sistema operacional, por exemplo, usa e abusa de filas e pilhas para organizar os processos, o que deve ser executado primeiro, depois etc.<br />
<div>
<br /></div>
Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com9tag:blogger.com,1999:blog-6926985245178197542.post-89197149701973464182013-10-07T20:46:00.002-07:002018-11-22T11:23:55.244-08:00A função realloc(): realocando memória dinamicamente e a calloc()Neste tutorial de nossa <a href="http://www.cprogressivo.net/p/curso-de-c-online-para-iniciantes.html" target="_blank">apostila de C</a>, iremos aprender o que é a função realloc(), para que serve o realocamento de memória, vamos ver como fazer isso através de exemplos de códigos comentados, alar sobre a função calloc(), além de dar mais dicas sobre alocação dinâmica de memória.<br />
<br />
Esta função completa nosso estudo sobre a <a href="http://www.cprogressivo.net/2013/03/O-que-e-alocacao-dinamica-de-memoria-em-Linguagem-C.html" target="_blank">alocação dinâmica</a>, junto com os artigos sobre a <a href="http://www.cprogressivo.net/2013/04/Como-usar-a-funcao-malloc-para-alocar-memoria-em-linguagem-C.html" target="_blank">função malloc()</a> e sobre a <a href="http://www.cprogressivo.net/2013/10/Funcao-free-Como-liberar-memoria-e-evitar-vazamento.html" target="_blank">liberação de memória com a função free()</a>.<br />
<a name='more'></a><ul>
<li>Leia este tutorial no seu computador ou celular: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
<li><a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Clique aqui e obtenha seu certificado de programação C e entre no Mercado de Trabalho !</a></li>
</ul>
<br />
<h2>
<span style="font-size: x-large;">Problemas com a malloc()</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Quando ensinamos o uso da função malloc() explicamos que ela aloca um determinado número de blocos 'n' de tamanho 'tam' bytes cada, e retorna o endereço desse bloco, através da seguinte sintaxe:<br />
malloc(n*tam);<br />
<br />
Aparentemente, ela está ok.<br />
Mas dependendo da situação que estejamos analisando, a função malloc() pode não ser o suficiente para não resolver alguns problemas. Na verdade, veremos problemas que ela não vai sempre resolver da maneira mais eficiente possível.<br />
Isso decorre do fato de que temos que saber o 'tanto' de blocos que vamos alocar.<br />
<br />
Vamos supor que precisemos de 10 blocos de memória do tipo int.<br />
Depois, descobrimos que precisamos de mais 2. O que fazemos?<br />
Usamos a malloc para armazenar 12 blocos, passamos o conteúdo alocado previamente e liberamos o espaço anterior.<br />
<br />
Resolvemos uma questão no artigo passado, que calculava a média de qualquer quantidade de números fornecida pelo usuário.<br />
Porém, lá alocávamos o tanto certo, calculávamos a média e depois liberávamos o bloco de memória.<br />
Ou seja, não precisávamos do que tinha sido alocado antes, simplesmente alocávamos outro bloco de memória, para cada operação.<br />
<br />
E vamos parar para pensar nesse exemplo.<br />
O usuário vai pedir a média de 10 números. Ok, você aloca facilmente os 10 com o uso da malloc().<br />
Na próxima iteração, ele pede a média de 12 números, então você libera o anterior e aloca outro bloco.<br />
Cá entre nós, não seria mais fácil pro computador simplesmente alocar mais 2 espaços? Quem sabe existe mais 2 blocos de memória ali, logo ao lado daqueles 10.<br />
<br />
E ainda falando no problema que citamos.<br />
Suponha que você alocou um espaço para armazenar 1000 structs, com dados sobre 1000 alunos de uma escola.<br />
Ok, até aí tudo bem.<br />
Mas no ano seguinte entraram mais 200 alunos. E aí?<br />
Aloca um bloco de 1200 e copia o conteúdo anterior, não é?<br />
Não seria mais fácil, rápido e eficiente se pudéssemos simples alocar mais 200 blocos, sem alterar os 1000 anteriores?<br />
Seria melhor ainda se pudéssemos alocar esses 200 blocos ao lado dos 1000 previamente alocados.<br />
<br />
Pois são esses, e outros tipos de contratempos, que a função realloc() vai resolver.<br />
<br />
<h2>
<span style="font-size: x-large;">A função realloc(): O que é, para que serve e como usar</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
Agora que já mostramos que nem sempre a malloc() é a solução mais eficiente e produtiva, vamos mostrar como tais problemas podem ser contornados, através do uso da função realloc().<br />
<br />
Como o próprio nome diz, ela realoca um espaço de memória.<br />
Ou seja, para realocar é necessário que algo tenha sido alocado. Então, antes de ver a sintaxe da realloc() podemos concluir que para usar ela é necessário ter um ponteiro que foi usado para alocar um espaço de memória.<br />
A realloc(), assim como a malloc(), retorna um endereço com um novo bloco de memória.<br />
<br />
Seja 'ptr' esse ponteiro, a sintaxe para o uso da função realloc() é:<br />
<span style="color: red;">realloc(ptr, numero_bytes);</span><br />
<br />
O 'numero_bytes' é o número de bytes que queremos realocar. É exatamente da mesma maneira que fizemos como na malloc(), onde geralmente fazemos 'n * sizeof(tipo)'.<br />
<br />
Outra coisa que devemos lembrar é que um ponteiro deve receber o endereço da realloc(), ou seja, não devemos usar ela de maneira 'solta', alguém devem receber seu retorno. É um erro comum simplesmente escrever algo do tipo:<br />
<span style="color: red;">realloc( ponteiro, n*sizeof(int) )</span><br />
<br />
E achar que agora o ponteiro 'ponteiro' foi usado para alocar aquele espaço de memória, quando não foi.<br />
Se quisermos fazer isso, devemos capturar o retorno:<br />
<span style="color: red;">ponteiro =(int *) realloc( ponteiro, n*sizeof(int) );</span><br />
<br />
Note que devemos usar o cast de ponteiros aqui também, como na malloc.<br />
Ou seja, se o ponteiro 'ptr' aponta para float, fazemos:<br />
<span style="color: red;">ptr = (float *) realloc( ptr, n*sizeof(float) );</span><br />
Se for do tipo char:<br />
<span style="color: red;">ptr = (char *) realloc( ptr, n*sizeof(char) );</span><br />
<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<h2>
<span style="font-size: x-large;">Memória não alocada</span></h2>
Antes de mostrar um exemplo prático do uso da função realloc(), vamos fazer uma pausa neste tutorial de nossa apostila para dar mais uma dica, um bom hábito de programação que você deve ter.<br />
<br />
Até o momento estávamos agindo como se a memória fosse sempre alocada, o que geralmente ocorre, pois as máquinas atuais possuem muito espaço em memória, e para as aplicações simples e básicas de nosso curso, precisamos de alocar pouca memória.<br />
<br />
Porém quando você se tornar profissional e for criar aplicativos mais complexos e robustos, ou for trabalhar com dispositivos com pouca memória (como microcontroladores), verá que nem sempre existe espaço suficiente de memória.<br />
<br />
Quando pedimos memória e não há espaço suficiente, a função retorna o endereço NULL.<br />
Por isso, faça sempre um <a href="http://www.cprogressivo.net/2013/01/O-testecondicional-IF-ELSE.html" target="_blank">teste condicional IF</a> após alocação de memória, para tratar o caso em que não exista espaço suficiente de memória.<br />
<br />
Como exemplo, vamos tentar alocar um espaço de memória absurdamente grande, e vemos a mensagem de erro:<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span><span style="color: #808030;">*</span> ptr <span style="color: #808030;">=</span> <span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: #008c00;">1000000000000000000</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>ptr <span style="color: #808030;">=</span><span style="color: #808030;">=</span> <span style="color: #7d0045;">NULL</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Sem espaço suficiente</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
<br />
A realloc() exige que você envie um ponteiro para ela por que pode ser que o novo bloco de memória que você pediu não esteja adjacente ao bloco que você indicou através do ponteiro, então o computador vai buscar outro bloco de endereço, daí o endereço do ponteiro muda.<br />
<br />
Esse ponteiro que você passou, não necessariamente tinha que ter sido usado para aloca memória, pois se ele apontar para NULL, por exemplo, a realloc() vai funcionar exatamente como a malloc().<br />
<br />
<h2>
<span style="font-size: x-large;">Exemplo de código: Como usar a função realloc() em C</span></h2>
<b>Crie um programa que armazene dinamicamente números fornecidos pelo usuário.</b><br />
<b>O programa deve perguntar quantos números o usuário quer adicionar e receber tais números.</b><br />
<b>Não desperdice memória e tempo, use a função realloc() para realocar memória sempre que o usuário quiser inserir mais números.</b><br />
<br />
Vamos usar 3 variáveis.<br />
Um inteiro 'opcao' para armazenar a opção do usuário no menu, outro inteiro 'size' que vai armazenar o tamanho do array de números e o ponteiro para inteiro, que irá receber o endereço do array alocado.<br />
<br />
Na função menu(), simplesmente colocamos as opções de Sair, Colocar mais números ou Exibir a lista de números.<br />
Essa função retorna o inteiro da escolha do usuário.<br />
<br />
Vamos usar o retorno dessa função menu() dentro de um <a href="http://www.cprogressivo.net/2013/02/O-teste-condicional-SWITCH-o-que-e-para-que-serve-e-como-usar-o-switch-em-C.html" target="_blank">teste condicional switch</a> que irá tratar cada opção descrita pelo usuário.<br />
Esse switch está dentro de um <a href="http://www.cprogressivo.net/2013/02/O-que-e-e-como-usar-o-laco-DO-WHILE-em-linguagem-C.html" target="_blank">laço do while</a>, que só termina quando o usuário digitar 0 (opcao=0).<br />
<br />
A primeira função é realoca(), que vai receber dois argumentos: o ponteiro que irá guardar o endereço do bloco alocado e o tamanho do array de inteiros. Porém, não vamos enviar o inteiro 'size', e sim seu endereço de memória, pois queremos que este inteiro seja alterado dentro da função realoca().<br />
<br />
Dentro desta função nós perguntamos quantos números o usuário quer adicionar à lista, e armazenamos essa informação na variável 'add'.<br />
Agora vamos realocar nosso bloco de memória, que antes era do tamanho '*size' (lembre-se que passamos o endereço de memória do inteiro, então para pegar o valor armazenado nesse endereço usamos *size em vez de size, como ensinamos em nossas seção sobre <a href="http://www.cprogressivo.net/p/aprenda-tudo-sobre-ponteiros-em-c.html" target="_blank">Ponteiros em C</a> de nossa apostila).<br />
<br />
Depois vamos pedir esses números para os usuários, e vamos adicionar os números no array. Fazemos isso através da variável 'count' dentro de um laço for. O count vai de 0 até (add-1). Então esses novos números vão sempre no final do array, a partir da posição (*size) até a (*size + add - 1).<br />
<br />
Feito isso, temos que mudar o valor da 'size', pois nosso array cresce. Era *size, agora é (*size + add), fazemos isso assim: *size += add<br />
E feito, retornamos o novo ponteiro, com os novos números adicionados à lista.<br />
<br />
Vale lembrar que após usar a realloc() devemos checar se seu computador conseguiu espaço em memória.<br />
Se conseguiu, o teste if(ptr) retorna valor lógico TRUE, pois 'ptr' não é NULL, e fazemos a alocação.<br />
Caso não tenha conseguido alocar o espaço de memória, o ponteiro 'ptr' vai apontar para NULL e o teste será falso, indo para o else que termina o programa.<br />
<br />
Por fim, a função exib() recebe o ponteiro e o tamanho do array, e simplesmente exibe todos seus elementos.<br />
Sem segredo.<br />
E, como não podemos esquecer, liberamos a memória alocada, que é pontada pelo ponteiro 'ptr', através da função free().<br />
<br />
Logo, o código de nosso programa em C fica:<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span><span style="color: #808030;">*</span> realoca<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span><span style="color: #808030;">*</span> ptr<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span><span style="color: #808030;">*</span> size<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: #808030;">,</span>
add<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Deseja adicionar quantos numeros: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>add<span style="color: #808030;">)</span><span style="color: purple;">;</span>
ptr <span style="color: #808030;">=</span> <span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">realloc</span><span style="color: #808030;">(</span>ptr<span style="color: #808030;">,</span> <span style="color: #808030;">(</span><span style="color: #808030;">*</span>size <span style="color: #808030;">+</span> add<span style="color: #808030;">)</span><span style="color: #808030;">*</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span><span style="color: #808030;">)</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>ptr<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> add <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Numero [</span><span style="color: #0f69ff;">%d</span><span style="color: #0000e6;">]: </span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> count<span style="color: #808030;">+</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>ptr<span style="color: #808030;">[</span><span style="color: #808030;">*</span>size <span style="color: #808030;">+</span> count<span style="color: #808030;">]</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: #808030;">*</span>size <span style="color: #808030;">+</span><span style="color: #808030;">=</span> add<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">else</span>
<span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Espaço em memória insuficiente</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>ptr<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">exit</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">return</span> ptr<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span><span style="color: #808030;">*</span> ptr<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> size<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count<span style="color: #808030;"><</span>size <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%3d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> ptr<span style="color: #808030;">[</span>count<span style="color: #808030;">]</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> menu<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opcao<span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;">O que deseja: </span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">0. Sair</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">1. Adicionar numeros</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">2. Exibir lista de numeros</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Opcao: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>opcao<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> opcao<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> opcao<span style="color: #808030;">,</span>
size<span style="color: #808030;">=</span><span style="color: #008c00;">0</span><span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>ptr<span style="color: #808030;">=</span><span style="color: #7d0045;">NULL</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">do</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">switch</span><span style="color: #808030;">(</span>menu<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">0</span><span style="color: #e34adc;">:</span>
opcao<span style="color: #808030;">=</span><span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">1</span><span style="color: #e34adc;">:</span>
ptr<span style="color: #808030;">=</span>realoca<span style="color: #808030;">(</span>ptr<span style="color: #808030;">,</span> <span style="color: #808030;">&</span>size<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">case </span><span style="color: #008c00;">2</span><span style="color: #e34adc;">:</span>
exibe<span style="color: #808030;">(</span>ptr<span style="color: #808030;">,</span> size<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">break</span><span style="color: purple;">;</span>
<span style="color: #e34adc;"> </span><span style="color: maroon; font-weight: bold;">default</span><span style="color: #e34adc;">:</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Opcao invalida!</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span><span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>opcao<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>ptr<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
<h2>
<span style="font-size: x-large;">A função calloc()</span></h2>
Para finalizar nossos estudos sobre alocação dinâmica de memória, vamos falar da função calloc() que é parecidíssima com a malloc(). Uma dessas diferenças é na sintaxe, porém seu propósito é o mesmo: alocar blocos de bytes em memória.<br />
<br />
A sintaxe da calloc() é:<br />
<span style="color: red;">calloc(numero, tamanho_em_bytes);</span><br />
<br />
Lembre-se que na malloc fazíamos: <span style="color: red;">malloc(numero * tamanho_em_bytes)</span><br />
Também usamos casting nos ponteiros.<br />
<br />
Por exemplo, para alocar 'n' blocos de inteiros, com a calloc fazemos:<br />
<span style="color: red;">ptr = (int *) calloc(n, sizeof(int) );</span><br />
<br />
O mesmo para float:<br />
<span style="color: red;">ptr = (float *) calloc(n, sizeof(float) );</span><br />
<br />
<h2>
<span style="font-size: x-large;">Diferença entre calloc() e malloc()</span></h2>
Se pensar um pouco, a função calloc() é praticamente igual à malloc().<br />
Porém, há uma pequena diferença.<br />
<br />
Quando usamos a malloc() simplesmente reservamos um espaço de memória.<br />
Já quando usamos a calloc(), além de reservar esse espaço de memória ele muda os valores contidos nesses bytes, colocando todos para 0. É como se usássemos a função memset(), que inicializa um bloco de memória com valor 0.<br />
<br />
Então, quando devemos usar malloc() e calloc()?<br />
Se você tiver que inicializar um bloco de memória com 0, faça isso usando a calloc(), pois é mais simples e otimizado que fazendo isso manualmente. Na verdade, enquanto seu computador está ocioso ele faz com que alguns espaços de memória recebam esse valor 0, e quando você for usar a calloc() ele vai procurar um bloco que esteja 'zerado', então, no geral, a calloc() é mais rápida e otimizada que a malloc().<br />
<br />
A calloc() é muito usada para se trabalhar com vetores multidimensionais (matrizes), pois facilita para alocar uma certa quantidade de números de vetores, por exemplo.<br />
<br />
Outro uso é no quesito segurança.<br />
No tutorial passado de nosso curso nós mostramos que após usar um bloco de memória devemos apontar o ponteiro para NULL, pois senão ele continua apontando para o local antigo da memória, e isso seria uma grave falha, um brecha no sistema.<br />
A vantagem da calloc() é que ele apaga os dados que existiam antes naquele bloco de memória, fazendo assim uma segurança maior, pois apaga as informações anteriores.<br />
<br />
<h2>
<span style="font-size: x-large;">Exercícios propostos com calloc() e realloc()</span></h2>
1. Defina uma função chamada callocc(), que faz exatamente o que a calloc() faz.<br />
Faça ela usando as funções malloc() e a memset(), que recebe três argumentos (o ponteiro, o que queremos colocar em todas as posições do vetor e o número de bytes):<br />
memset(ptr, '\0', numero * tamanho_em_bytes);<br />
<br />
2. Crie um programa que forneça os números de Fibonacci, o usuário escolhe o n-ésimo termo, e você fornece.<br />
Calcule usando a realloc() para alocar memória.<br />
Crie uma opção de modo que o usuário pode pedir outro termo, e esse novo termo deve ser achado da maneira mais eficiente possível (sem ter que recalcula todos os elementos de novo, pois os elementos da consulta anterior ainda estão no vetor - lembre-se que a realloc() aloca novos bytes e não apaga os anteriores).<br />
<br />
O termo 't(n)' da sequência de Fibonacci é a soma dos dois anteriores<br />
t(n) = t(n-1) + t(n-2), onde t(0)=0 e t(1)=1.<br />
<br />
A sequência de Fibonacci revela coisas interessantíssimas sobre diversos fatos da natureza:<br />
<a href="http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Fibonacci" target="_blank">http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Fibonacci</a>Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com4tag:blogger.com,1999:blog-6926985245178197542.post-53292031752360661962013-10-03T18:04:00.002-07:002018-11-22T11:20:58.138-08:00A função free() - Liberar e evitar vazamento de memóriaNo artigo passado de nossa apostila de C, ensinamos o <a href="http://www.cprogressivo.net/2013/04/Como-usar-a-funcao-malloc-para-alocar-memoria-em-linguagem-C.html" target="_blank">como alocar memória de uma maneira dinâmica, através da função malloc() da biblioteca stdlib.h</a><br />
<br />
Agora vamos ensinar como liberar essa memória que foi previamente alocada, que é um bom hábito que evita um famoso problema, o vazamento de memória. E ao término do tutorial, vamos resolver um exercício que foi proposto no artigo passado, onde iremos mostrar o uso das funções malloc() e free().<br />
<ul>
<li>Download do curso: <a href="https://www.cprogressivo.net/p/apostila-c-progressivo.html" target="_blank">Apostila C Progressivo</a></li>
</ul>
<a name='more'></a><br />
<a href="http://afiliado.bravacursos.com.br/4573/curso-de-programacao-em-c/" rel="nofollow" target="_blank">Entre no mercado de trabalho! Clique aqui e obtenha seu certificado de programação C!</a><br />
<br />
<h2>
<span style="font-size: x-large;">Memory leak (vazamento de memória) em linguagem C</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* CP-POST */
google_ad_slot = "2751252408";
google_ad_width = 336;
google_ad_height = 280;
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
No artigo inicial desta seção sobre <a href="http://www.cprogressivo.net/p/alocacao-dinamica-de-memoria-em-c.html" target="_blank">alocação dinâmica de memória</a>, citamos vários motivos pela qual o uso desta técnicas é imprescindível para qualquer programador C, e é um verdadeiro diferencial em relação à grande maioria das outras linguagens de programação, pois poucas irão lhe propiciar o poder de controlar cada byte da memória de seu computador.<br />
<br />
Vimos que ao usar a função malloc() estamos, na verdade, reservando um espaço em memória. Isto se chama alocar, e uma vez feito isso, aquela região da memória estará protegida e não será possível usar ela para outro propósito.<br />
Porém, por mais que tenha uma memória grande, ela será sempre limitada, e há certas aplicações (como um sistema operacional ou um jogo de alta performance) que irão exigir, e muito, de sua memória.<br />
<br />
E é aí que surge o problema que embasa este artigo de nossa apostila: se você alocar muita memória, chegará uma hora que não vai ter mais nenhum byte disponível para uso e seu software vai simplesmente parar (as vezes seu computador simplesmente trava e não volta nem com reza brava).<br />
<br />
Geralmente isso ocorre por uma falha de programação, pois o programador simplesmente deixou muita memória 'vazar'.<br />
Uma maneira simples de acontecer isso é ficar alocando memória dentro de um looping e não liberar ela antes do término desse looping.<br />
<br />
Como você deve ter estudado funções em C, quando criamos uma variável dentro do escopo da função, é como se ela não existisse fora dela. Então podemos criar um ponteiro, alocar memória e fazer o dito cujo ponteiro armazenar o endereço da memória alocada. Se não liberarmos a memória antes da função acabar, ela vai ficar eternamente alocada e inacessível, pois 'perdemos' o ponteiro quando a função terminou.<br />
<br />
Vamos mostrar como é isso na prática.<br />
Criamos uma função chamada aloca(), que não recebe nem retorna nada.<br />
Dentro dela criamos um ponteiro para um inteiro e em seguida alocamos 100 bytes, através da malloc().<br />
Obviamente, quando a função termina, esse ponteiro deixa de existir, mas a memória reservada continua lá, e inacessível.<br />
<br />
Na nossa main() fazemos infinitas chamadas da função aloca(), que aos poucos vai reservando de 100 em 100 bytes a memória de seu computador. E aos poucos você vai notar sua máquina ficando lenta, pois vai haver cada vez menos memória, vai ficando cada vez mais 'difícil' de achar espaços para alocar até...sua máquina travar completamente.<br />
<br />
Veja, é um código bem simples, usa coisas básicas que aprendemos aqui em nosso curso e mostra bem o que é o vazamento de memória:<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">void</span> aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span>ptr<span style="color: purple;">;</span>
ptr <span style="color: #808030;">=</span> <span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: #008c00;">100</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span>
aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
Se estiver no Linux, abra uma janela de seu terminal e digite: free -m -s 1<br />
Esse comando irá mostrar, a cada 1 segundo, o estado das memórias livres em sua máquina.<br />
<br />
<h2>
<span style="font-size: x-large;">free(): A função que libera memória</span></h2>
<div style="display: inline; float: left; margin-right: 5px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Bloco no texto */
google_ad_slot = "2705060807";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
A solução para este tipo de problema é simples, basta usar a função free(), que vai liberar o espaço de memória que foi previamente alocado. Assim como outras funções de alocação dinâmica de memória, esta função também está na biblioteca stdlib.h<br />
<br />
Ela recebe um ponteiro, o que foi usado para receber o endereço do bloco de memória alocada, e não retorna nada.<br />
Ou seja, sua sintaxe é bem simples:<br />
<br />
<i><span style="color: red;">free(ponteiro);</span></i><br />
<br />
O grande problema reside na pergunta 'Onde liberar memória?'<br />
Se seu projeto for mais simples, provavelmente só vai precisar liberar ao final de sua aplicação (embora a memória seja geralmente liberada após terminar um programa, é uma boa prática de programação sempre liberar o que foi alocado antes de sua aplicação terminar).<br />
<br />
Mas, basicamente, devemos liberar a memória sempre que não formos mais usar o que foi alocado.<br />
Isso geralmente acontece ao final das funções ou loopings que fazem pedidos de alocação de memória.<br />
<br />
Como exemplo, podemos 'consertar' o exemplo de código passado, simplesmente colocando free(ptr) ao final da função.<br />
Veja que agora ela pode rodar infinitamente, pois a memória alocada é liberada após seu 'uso'.<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">void</span> aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span>ptr<span style="color: purple;">;</span>
ptr <span style="color: #808030;">=</span> <span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: #008c00;">100</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>ptr<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span>
aloca<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
<span style="font-size: x-large;"><br /></span>
<br />
<table border="0" cellpadding="0" cellspacing="0" style="width: 85%px;">
<tbody>
<tr>
<td><div align="left">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
<td><div align="center">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3925537054052519";
/* C Progressivo - Links no Texto */
google_ad_slot = "4181794005";
google_ad_width = 180;
google_ad_height = 90;
//-->
</script>
<script src="https://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
</div>
</td>
</tr>
</tbody></table>
<br />
<span style="font-size: x-large;"><br /></span>
<br />
<h2>
<span style="font-size: x-large;">A importância do bom gerenciamento de memória</span></h2>
Como havíamos dito, usar alocação de memória fará sempre seus programas serem mais robustos e seguros, por isso indicamos que use sempre em seus projetos, mesmo nos mais simples. E obviamente, sempre libere a memória alocada após seu uso, pois o vazamento de memória é um problema muito comum, que certamente você irá se deparar, caso siga a profissão.<br />
<br />
É um problema tão habitual, que atormenta tanto os programadores, que existem até ferramentas para detectar os 'leaks memory'. Muitas vezes isto ocorre não por um erro, mas sim por um ataque.<br />
Os anti-vírus, por exemplo, estão sempre gerenciando o uso da memória dos computadores que protegem, pois é um tipo de ataque comum, consumir toda a memória de um sistema, para travá-lo e tirá-lo do ar.<br />
<br />
Se isso pode ocorrer em máquinas boas e modernas, imagine para quem trabalha com microcontroladores, por exemplo, que muitas vezes possuem apenas alguns poucos kilobytes de memória. Não é à toa que engenheiros de computação que trabalham com hardware estão sempre preocupados com a maneira na qual usam a memória de seus projetos.<br />
<br />
Linguagens de programação de alto nível, como o Java, geralmente fazem de maneira 'automática' esse gerenciamento de memória. Geralmente funciona de maneira razoável, raramente funciona de maneira perfeita.<br />
O ideal, para garantir que seu aplicativo seja sempre o mais confiável, robusto, seguro e rápido, só mesmo gerenciando 'na mão'.<br />
<br />
Como diz o ditado: Se quer algo bem feito, faça-o você mesmo.<br />
<br />
<h2>
<span style="font-size: x-large;">Alocação de memória, free() e segurança</span></h2>
Embora o ensino da alocação e liberação de memória seja comum em vários livros e cursos, algumas coisas passam batido, principalmente no que se refere à segurança de uma aplicação.<br />
<br />
Vamos mostrar agora uma maneira bem comum de explorar falhas através dos ponteiros.<br />
Vamos criar um programa simples, que irá pedir uma senha e armazenar num local que foi previamente alocado.<br />
Então você usa essa senha como quiser, e como é um bom programador, irá usar a free() para liberar a memória que foi usada, até mesmo por questões de segurança.<br />
<br />
Porém, ao contrário do que muitos pensam (e aí que mora o perigo), ao liberar a memória você não vai apagar os dados existentes nela, você vai apenas dizer ao seu computador "Hey, esse bloco de bytes aqui, já usei, então você pode pegar para fazer outra coisa".<br />
<br />
Mas as informações ainda estão lá. E como obter o que tem lá?<br />
Através do ponteiro que ainda aponta para lá. Ou seja, a free() não vai mudar o endereço armazenado no ponteiro, ele ainda vai continuar apontando para sua senha mesmo após aquele bloco de memória ter sido liberado.<br />
<br />
Veja o código do programa:<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">char</span> <span style="color: #808030;">*</span>senha<span style="color: purple;">;</span>
senha <span style="color: #808030;">=</span> <span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">char</span> <span style="color: #808030;">*</span><span style="color: #808030;">)</span> <span style="color: #603000;">malloc</span><span style="color: #808030;">(</span><span style="color: #008c00;">21</span><span style="color: #808030;">*</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">char</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Digite sua senha [ate 20 caracteres]: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">%[^</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;">]s</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> senha<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Senha: </span><span style="color: #0f69ff;">%s</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> senha<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Endereço antes da free(): </span><span style="color: #0f69ff;">%d</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>senha<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>senha<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Endereço depois da free(): </span><span style="color: #0f69ff;">%d</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>senha<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
O resultado:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWYvdgJnG3SSt-f2sanK8BVzgOMZspUOicNugZIUp7PwD0I4FqnrtUFrCCzN4UY8RxNTM3ejJx3CIKKefj9qdjgwLN0cXx5xWdb6D9P_vSUJvfgyrDja-OXsoxdHxKhZKjbZCO_znYT4c/s1600/Explorando-falha-dos-ponteiros.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWYvdgJnG3SSt-f2sanK8BVzgOMZspUOicNugZIUp7PwD0I4FqnrtUFrCCzN4UY8RxNTM3ejJx3CIKKefj9qdjgwLN0cXx5xWdb6D9P_vSUJvfgyrDja-OXsoxdHxKhZKjbZCO_znYT4c/s400/Explorando-falha-dos-ponteiros.png" width="400" /></a></div>
<br />
Ou seja, o ponteiro maroto continua apontando pro local da memória que está minha senha, e alguém poderá usar de uma maneira bem maléfica caso eu não tenha gravado outra coisa por cima desse bloco de memória. Como nos proteger, então?<br />
<br />
Uma boa prática de segurança é que sempre que for 'liberar' seus ponteiros, fazer eles apontarem para NULL.<br />
Ou seja, faça:<br />
<span style="color: red;">ptr=NULL;</span><br />
<br />
Sempre que usar a free(), pois embora tenha liberado a memória para outro uso, o ponteiro continuará apontando para aquele endereço de memória.<br />
Assim, o ponteiro não vai mais te dedurar.<br />
<br />
<h2>
<span style="font-size: x-large;">Exercício resolvido: Usando malloc() e free()</span></h2>
No tutorial passado de nosso curso, passamos o seguinte exercício:<br />
<b>Crie um programa que calcula a média de uma quantidade qualquer (informada pelo usuário) de números.</b><br />
<b>O programa deve armazenas esses números em um vetor. Depois, use esse vetor para mostrar todos os números e mostrar a média dele.</b><br />
<b>Use alocação dinâmica de memória para colocar os números no vetor. Não desperdice memória.</b><br />
<br />
Vamos resolvê-lo agora para ilustrar o uso da malloc() e da free().<br />
Na main(), o programa inicia um looping, que só para se o usuário digitar 0.<br />
<br />
Neste looping é pedido um número inteiro, que será o tanto de números que o usuário vai digitar.<br />
Após ele fornecer essa informação, passamos ela para a função aloca() que vai alocar dinamicamente um vetor de inteiros, com o número de elementos exato que o usuário digitou, e retornar o endereço desse espaço alocado.<br />
<br />
Esse endereço é armazenado no ponteiro *numeros, da main().<br />
Em seguida, mandamos esse vetor e o número de elementos para a função media(), que irá calcular a média de todos os elementos deste vetor e retornar esse float (a média de inteiros pode ser um número decimal).<br />
Também mandamos os mesmos argumentos para a função exibe(), que irá mostrar os números digitados.<br />
<br />
Após cada iteração do laço while, devemos liberar a memória que está apontado pelo ponteiro *numeros, senão fizermos isso a função aloca() vai alocar um espaço diferente de memória a cada iteração, consumindo a memória aos poucos.<br />
<br />
<pre><span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdio.h</span><span style="color: maroon;">></span>
<span style="color: #004a43;">#</span><span style="color: #004a43;">include </span><span style="color: maroon;"><</span><span style="color: #40015a;">stdlib.h</span><span style="color: maroon;">></span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span>aloca<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> num<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>numbers<span style="color: purple;">;</span>
numbers <span style="color: #808030;">=</span> <span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span><span style="color: #808030;">)</span><span style="color: #603000;">malloc</span><span style="color: #808030;">(</span>num<span style="color: #808030;">*</span><span style="color: maroon; font-weight: bold;">sizeof</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span><span style="color: #808030;">)</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> num <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Numero [</span><span style="color: #0f69ff;">%d</span><span style="color: #0000e6;">]: </span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> count<span style="color: #808030;">+</span><span style="color: #008c00;">1</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>numbers<span style="color: #808030;">[</span>count<span style="color: #808030;">]</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">return</span> numbers<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">float</span> media<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span>numbers<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> num<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">float</span> media<span style="color: #808030;">=</span><span style="color: green;">0.0</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count<span style="color: #808030;"><</span>num <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
media <span style="color: #808030;">+</span><span style="color: #808030;">=</span> numbers<span style="color: #808030;">[</span>count<span style="color: #808030;">]</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">return</span> media<span style="color: #808030;">/</span>num<span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">void</span> exibe<span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">int</span> <span style="color: #808030;">*</span>numbers<span style="color: #808030;">,</span> <span style="color: maroon; font-weight: bold;">int</span> num<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> count<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">for</span><span style="color: #808030;">(</span>count<span style="color: #808030;">=</span><span style="color: #008c00;">0</span> <span style="color: purple;">;</span> count <span style="color: #808030;"><</span> num <span style="color: purple;">;</span> count<span style="color: #808030;">+</span><span style="color: #808030;">+</span><span style="color: #808030;">)</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%3d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> numbers<span style="color: #808030;">[</span>count<span style="color: #808030;">]</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">int</span> <span style="color: #400000;">main</span><span style="color: #808030;">(</span><span style="color: maroon; font-weight: bold;">void</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: maroon; font-weight: bold;">int</span> num<span style="color: #808030;">=</span><span style="color: #008c00;">1</span><span style="color: #808030;">,</span>
<span style="color: #808030;">*</span>numeros<span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">while</span><span style="color: #808030;">(</span>num<span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0000e6;">Media de quantos numeros [0 para sair]: </span><span style="color: maroon;">"</span><span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">scanf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">%d</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> <span style="color: #808030;">&</span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: maroon; font-weight: bold;">if</span><span style="color: #808030;">(</span>num <span style="color: #808030;">></span> <span style="color: #008c00;">0</span><span style="color: #808030;">)</span>
<span style="color: purple;">{</span>
numeros <span style="color: #808030;">=</span> aloca<span style="color: #808030;">(</span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
exibe<span style="color: #808030;">(</span>numeros<span style="color: #808030;">,</span>num<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">printf</span><span style="color: #808030;">(</span><span style="color: maroon;">"</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;">A media destes numeros eh: </span><span style="color: #0f69ff;">%.2f</span><span style="color: #0f69ff;">\n</span><span style="color: maroon;">"</span><span style="color: #808030;">,</span> media<span style="color: #808030;">(</span>numeros<span style="color: #808030;">,</span> num<span style="color: #808030;">)</span> <span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: #603000;">free</span><span style="color: #808030;">(</span>numeros<span style="color: #808030;">)</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span>
<span style="color: purple;">}</span>
<span style="color: maroon; font-weight: bold;">return</span> <span style="color: #008c00;">0</span><span style="color: purple;">;</span>
<span style="color: purple;">}</span></pre>
<br />
<br />
Esse programa calcula a média de 1, 2, 10, mil ou 1 milhão de números.<br />
E o melhor, só aloca 1, 2, 10, mil ou exatos 1 milhão de bytes, nem um a mais. Extramente econômico, não deixa seu computador 'lerdo' por consumir memória demais, o que é um grande problema ocasionado por péssimos programadores.<br />
<br />
A Wikipedia possui um excelente artigo sobre <a href="http://en.wikipedia.org/wiki/Memory_leak" target="_blank">Memory Leak</a>.Perfilhttp://www.blogger.com/profile/00756438306280709389noreply@blogger.com7